gpt4 book ai didi

Javascript 关闭?

转载 作者:行者123 更新时间:2023-12-04 00:52:41 25 4
gpt4 key购买 nike

方法一

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]();

上述方法用于将数组对象转换为单独的函数,这些函数在执行时返回特定的数组对象。想知道为什么方法 #1 有效而方法 #2 无效。

最佳答案

在方法#2 中有两个问题:

  1. 您返回的是键名 a,而不是数组值 ar[a]。也就是说,您想要的不是return a;return ar[a];

  2. 该函数将始终引用循环的最后一个值,因为它引用相同的作用域对象。要创建新的作用域对象,您需要一个闭包、一个 with block 或一个绑定(bind)函数。

闭包:

for(var a in ar) { 
var O = (function(val) {
return function() {
return val;
}
})(ar[a]);
alStr.push(O);
}

使用 with block :

for(var a in ar) { 
with({val: ar[a]}) {
alStr.push(function() {
return val;
});
}
}

绑定(bind)函数:

for(var a in ar) { 
var O = function(x) { return x; };
alStr.push(O.bind(null, arr[a]));
}

关于Javascript 关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11821484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com