我试图在循环中创建动态函数。但是,动态函数返回意外值。这是我的密码。
var obj = {
a: 'A',
b: 'B'
}
for(var key in obj) {
var value = obj[key];
obj['get'+key] = function() {
return value;
}
}
alert(obj.geta());
我期望geta()
返回A
,getb()
返回B
。但是,它们都返回B
。我尝试过在Chrome中使用调试模式,发现value
并不是在每次迭代中重置的。循环中的变量不应该在每次迭代中有所不同吗?
我做错了什么?我是不是有什么不理解的东西?
发布于 2017-03-24 01:56:48
您应该使用let
关键字来声明变量仅在block
中可见。
阅读更多关于let关键字的信息。
var obj = {
a: 'A',
b: 'B'
}
for(var key in obj) {
let value = obj[key];
obj['get'+key] = function() {
return value;
}
}
alert(obj.geta());
另一种方法是使用.bind()
方法,该方法创建一个新函数,在调用该函数时,将其关键字设置为提供的值。
var obj = {
a: 'A',
b: 'B'
}
for(var key in obj) {
var value = obj[key];
obj['get'+key] = (function(val) {
return val;
}).bind(this,value);
}
alert(obj.geta());
阅读更多关于绑定函数的信息。
https://stackoverflow.com/questions/42996245
复制