gpt4 book ai didi

javascript - 学习Javascript,为什么这两个函数表现不同?

转载 作者:行者123 更新时间:2023-12-02 18:25:49 24 4
gpt4 key购买 nike

学习Javascript,不明白为什么这两个函数不同。我看到了这个例子(我向函数添加了名称):

var txt = ["a","b","c"];

for (var i = 0; i < 3; ++i ) {
setTimeout((function myBind(msg) {
return function myAlert() { alert(msg); }
})(txt[i]), 1000);
}​

我看到正在返回一个调用警报的函数。于是我想,为什么不直接返回呢:

var txt = ["a","b","c"];

for (var i = 0; i < 3; ++i ) {
setTimeout( function() { alert(txt[i]);} ,1000);
}​

这最终会发出“未定义”警报。我明白这是因为它试图访问 txt[3] 因为一秒钟后循环完成并且 i 已设置为 3,但我不明白原始设置如何避免这个问题。

最佳答案

示例 1

闭包立即执行脚本,还允许您在内部传递参数它被存储并保持存储在该函数内。参数==param

(function(param){})(parameter)

在您的示例中,该函数返回另一个将由 setTimeout 执行的函数。

(function(param){
return function(){
alert(param)
}
})(parameter)

当您将之前的参数传递给函数时,它将返回正确的值。

示例 2

setTimeout 被调用了 3 次,但参数没有存储在任何地方因此它采用从 txt & i 知道的最后一个值,并且当循环在执行 setTimeout 之前结束时,该值为 3

<小时/>

基本上,在第一个示例中,您将每个 txt[i] 存储在使用这些闭包创建的每个函数中。

在第二个中,您不将 txt[i] 存储在任何地方。你只需告诉 setTimout 函数提醒 txt[i],1 秒后它是 for 循环创建的最后一个。

关于javascript - 学习Javascript,为什么这两个函数表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18393821/

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