gpt4 book ai didi

Javascript 函数作用域循环

转载 作者:数据小太阳 更新时间:2023-10-29 05:33:54 25 4
gpt4 key购买 nike

Here's an example一个简单的 JS 循环没有按预期运行的情况,因为循环变量不在单独的范围内。

通常提出的解决方案是构造一段看起来不愉快的循环代码,如下所示:

for (var i in obj) {
(function() {
... obj[i] ...
// this new shadowed i here is now no longer getting changed by for loop
})(i);
}

我的问题是,这可以改进吗?我可以用这个吗:

Object.prototype.each = function (f) {
for (var i in this) {
f(i,this[i]);
}
};

// leading to this somewhat more straightforward invocation
obj.each(
function(i,v) {
... v ...
// alternatively, v is identical to
... obj[i] ...
}
);

当我确定我需要一个“作用域循环”时?它看起来更干净一些,并且应该具有与常规 for 循环相似的性能(因为它以相同的方式使用)。

更新:似乎使用 Object.prototype 做事是一个巨大的禁忌,因为它几乎破坏了一切

这是一个侵入性较小的实现:

function each (obj,f) {
for (var i in obj) {
f(i,obj[i]);
}
}

调用略微更改为

each(obj,
function(i,v) {
... v ...
}
);

所以我想我已经回答了我自己的问题,如果 jQuery 这样做,就不会出错。我忽略的任何问题都需要一个答案。

最佳答案

你的回答几乎涵盖了它,但我认为你的原始循环的变化值得注意,因为当 each() 函数不方便时,使用普通的 for 循环是合理的,无论出于何种原因。

更新:更改为使用类似于 example referenced by the question 的示例比较不同的方法。该示例必须进行调整,因为 each() 函数需要一个填充的数组来迭代。

假设以下设置:

var vals = ['a', 'b', 'c', 'd'],
max = vals.length,
closures = [],
i;

使用问题中的示例,原始循环最终创建了 2n 个函数(其中 n 是迭代次数),因为在每次迭代期间创建了两个函数:

for (i = 0; i < max; i++) {
closures[i] = (function(idx, val) { // 1st - factoryFn - captures the values as arguments
return function() { // 2nd - alertFn - uses the arguments instead
alert(idx + ' -> ' + val); // of the variables
};
})(i, vals[i]);
}

这可以减少到只创建 n + 1 个函数,方法是在循环开始之前创建一次工厂函数,然后重新使用它:

var factoryFn = function(idx, val) {
return function() {
alert(idx + ' -> ' + val);
};
};

for (i = 0; i < max; i++) {
closures[i] = factoryFn(i, vals[i]);
}

这几乎等同于 each() 函数在这种情况下的使用方式,这也会导致总共创建 n + 1 个函数。工厂函数创建一次并立即作为参数传递给 each()

each(vals, function(idx, val) {
closures[idx] = function() {
alert(idx + ' -> ' + val);
};
});

FWIW,我认为使用 each() 的一个好处是代码更短一些,并且在传递到 each() 函数时可以正确创建工厂函数清楚地说明这是它的唯一用途。 for 循环版本的一个好处,IMO,是执行循环的代码就在那里,所以它的性质和行为是完全透明的,而 each() 函数可能是在不同的文件中定义,由其他人编写等。

关于Javascript 函数作用域循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14108230/

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