gpt4 book ai didi

Javascript 闭包

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:26 29 4
gpt4 key购买 nike

我读到闭包末尾的()会立即执行。那么,这两者之间有什么区别。我在一些代码中看到了第一个用法。

谢谢。

for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){
(function(val){
anotherFn(val);
})(a[i]);
}

for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){
anotherFn(a[i]);
}

最佳答案

在这个例子中没有区别。在这两种情况下,anotherFn 都会立即执行。

但是,当在循环中创建函数时,通常会使用立即函数。

考虑这个例子(或多或少的伪代码):

for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}

由于 JavaScript 只有函数作用域,没有 block 作用域,所有事件处理程序共享相同的 i,在循环结束后其值为 10。所以每个处理程序都会尝试提醒 values[10]

通过使用立即函数,引入了一个新的作用域,它“捕获”循环变量的当前值:

for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}

由于这有时难以阅读,创建一个返回另一个函数的独立函数通常更好:

function getHandler(value) {
return function(){alert(value);};
}

for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}

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

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