Javascript闭包? [英] Javascript closure?
问题描述
方法#1
function transform(ar) {
var alStr = [];
for(var i=0; i<ar.length; i++) {
alStr[i] = (function(v) {
return (function() {
return v;
});
}(ar[i]));
}
return alStr;
}
var a = ["a", 24, { foo: "bar" }];
var b = transform(a);
a[1];
b[1]();
方法2
function transform(ar) {
var alStr = [];
for(var a in ar) {
var O = function() {
return a;
}
alStr.push(O);
}
return alStr;
}
var a = ["a", 24, { foo: "bar" }];
var b = transform(a);
a[1];
b[1]();
上述方法用于将数组对象转换为单独的函数,目的。
The above mentioned methods are used to convert an array objects into individual functions which on execution return the specific array object. Want to know why method #1 works and method #2 doesnt.
推荐答案
在方法2中有两个问题:
In Method #2 there are two problems:
-
您要返回键名称
a
,而不是数组值,ar [a]
。也就是说,不是return a;
你想要return ar [a];
You are returning the key name,
a
, rather than the array value,ar[a]
. That is, rather thanreturn a;
you wantreturn ar[a];
.
该函数将始终引用最后一个循环的值,因为它引用了相同的范围对象。要创建一个新的scope对象,你需要一个闭包,一个 with
block或者一个绑定的函数。
The function will always refer to the last value looped through because it references the same scope object. To create a new scope object you will need a closure, a with
block, or a bound function.
使用闭包:
for(var a in ar) {
var O = (function(val) {
return function() {
return val;
}
})(ar[a]);
alStr.push(O);
}
block:
for(var a in ar) {
with({val: ar[a]}) {
alStr.push(function() {
return val;
});
}
}
使用绑定函数:
for(var a in ar) {
var O = function(x) { return x; };
alStr.push(O.bind(null, arr[a]));
}
这篇关于Javascript闭包?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!