说我有这个功能:IIFE和Javascript中的变量赋值。我们真的需要一个IIFE吗?到底是怎么回事?
function printFruits(fruits) {
for (var i = 0; i < fruits.length; i++) {
setTimeout(function() {
console.log(fruits[i]);
}, i * 1000);
}
}
printFruits(["Lemon", "Orange", "Mango"])
所以这将返回undefined 3倍。
我可以在一个较高水平,自变量是按值,而是由瓶盖内引用不存储...循环正在整理第一,由当时的功能从说不定事件循环离队看到的...变量已处于未定义状态(fruits.length
的计算结果为3,这对于此数组大小而言过高)。但为什么这个表现奇怪......它打印“苹果”3次。
function printFruits(fruits) {
for (var i = 0; i < fruits.length; i++) {
var someConstant = i;
setTimeout(function() {
console.log(fruits[someConstant]);
}, someConstant * 100);
}
}
printFruits(["mango", "banana", "apple"])
不应该someConstant
会改变以及我吗?为什么它总是2?
而且这个工程:
function printFruits(fruits) {
for (var i = 0; i < fruits.length; i++) {
(function() {
var current = i;
setTimeout(function() {
console.log(fruits[current]);
}, current * 1000);
})();
}
}
为什么是必要的IIFE来解决这个问题?
“不应该一些常数也会随着”而改变 - 这会引发一个参考错误,因为你从不定义'someCosntant'(拼写!)。如果我修复了这个错误...它不起作用:http://jsbin.com/yegimi/1/edit?js,console尝试创建真实的[mcve]。最好使用[live demos](https://stackoverflow.blog/2014/09/introducing-runnable-javascript-css-and-html-code-snippets/)。 – Quentin
定义“作品”。这个代码不是三次显示芒果吗? – deceze
'someConstant'和'i'都在相同的范围内定义。 'someConstant'只是'i'的别名。因此它有相同的根本问题,即使结果略有不同。这整个事情是一个* scope *的问题。只有创建一个新的范围才能解决问题。将更多变量添加到相同的作用域不会。 –