Javascript 定义函数时如何捕获外部变量的当前值

Javascript 定义函数时如何捕获外部变量的当前值,javascript,jquery,function,anonymous-function,Javascript,Jquery,Function,Anonymous Function,通常,我会以编程方式将处理程序附加到DOM中依赖于变量的元素上,这些变量以后可能会更改 nextID = "#content-" + dataElement.elementBack; something.on("change", function (e) { $(nextID).css({left: 0, position:'fixed', zindex: -1}); }); 触发此函数时,nextID的值已更改并作用于错误的元素 在函数首次定义或附加到事件时,是否有方法使用该变量的当

通常,我会以编程方式将处理程序附加到DOM中依赖于变量的元素上,这些变量以后可能会更改

nextID = "#content-" + dataElement.elementBack;
something.on("change", function (e) {
    $(nextID).css({left: 0, position:'fixed', zindex: -1});
});
触发此函数时,nextID的值已更改并作用于错误的元素

在函数首次定义或附加到事件时,是否有方法使用该变量的当前值


(请不要建议我在其中硬编码元素而不是nextID。如果我愿意,我可以。)

您可以创建一个iLife,将
nextID
的初始值绑定到该函数处理程序。目前,我们正在创建一个闭包,其中变量值的作用域是内部返回函数

nextID = "#content-" + dataElement.elementBack;
something.on("change", (function(nextID) { 
    return function (e) {
        $(nextID).css({left: 0, position:'fixed', zindex: -1});
       }
    })(nextID)
);

您可以创建一个IIFE,它将
nextID
的初始值绑定到该函数处理程序。目前,我们正在创建一个闭包,其中变量值的作用域是内部返回函数

nextID = "#content-" + dataElement.elementBack;
something.on("change", (function(nextID) { 
    return function (e) {
        $(nextID).css({left: 0, position:'fixed', zindex: -1});
       }
    })(nextID)
);

解决方法是使用自调用函数:

函数在JavaScript中创建新的作用域,并且由于您将
nextID
作为参数,因此
nextID
将获得作用域,并且当触发
change
事件时,它将被捕获并可用

这是因为JavaScript不会为任何其他语言构造(函数除外)创建作用域。例如,一个
For
For(var i=0;i<10;i++){}
不会创建作用域,循环结束后,
i
在当前作用域中可用,它将包含
10


我建议您查看下一版本ECMA脚本(ECMA脚本6)的关键字部分,它将允许我们创建块作用域变量。

解决方法是使用自调用函数:

函数在JavaScript中创建新的作用域,并且由于您将
nextID
作为参数,因此
nextID
将获得作用域,并且当触发
change
事件时,它将被捕获并可用

这是因为JavaScript不会为任何其他语言构造(函数除外)创建作用域。例如,一个
For
For(var i=0;i<10;i++){}
不会创建作用域,循环结束后,
i
在当前作用域中可用,它将包含
10


我建议您查看下一版本ECMA脚本(ECMA脚本6)的关键字部分这将允许我们创建块作用域变量。

创建一个IIFE,它将返回另一个函数创建一个IIFE,它将返回另一个函数您可以对此处发生的情况以及函数在声明时捕获变量值的原因进行更多解释吗?您可以对此处发生的情况进行更多解释吗为什么函数在声明时捕获变量值?很好的解释。疯狂的结构。它让我的大脑弯曲,就像试图找出12只猴子的情节一样。看看下面的@mohamedrias解决方案,这是不同形式的相同问题吗?是的,进一步看这篇文章,我可以看到这些答案是相似的。不过,虽然我很欣赏你的解释,但我也很欣赏另一个答案使结构保持了一种可识别且易于阅读的形式。@WesModes它并没有那么疯狂,12只猴子也不太难理解哈哈,顺便说一句,我的答案有一个主要优势:如果你想在代码部分中添加许多事件处理程序,一个自调用函数对于所有事件处理程序来说都足够了,而不必绑定许多自调用函数并多次捕获
nextID
。但是如果你开始思考Bruce Willis的角色是如何看待自己在童年时死亡的,以及这是如何激励他自愿参加时间旅行任务的,它扰乱了你的头脑,然后你成为了一名javascript程序员。@westheles你就是下一个亚里士多德:DGreat解释。疯狂的结构。它让我的大脑弯曲,就像试图找出12只猴子的情节一样。看看下面的@mohamedrias解决方案,这是不同形式的相同问题吗?是的,进一步看这篇文章,我可以看到这些答案是相似的。不过,虽然我很欣赏你的解释,但我也很欣赏另一个答案使结构保持了一种可识别且易于阅读的形式。@WesModes它并没有那么疯狂,12只猴子也不太难理解哈哈,顺便说一句,我的答案有一个主要优势:如果你想在代码部分中添加许多事件处理程序,一个自调用函数对于所有事件处理程序来说都足够了,而不必绑定许多自调用函数并多次捕获
nextID
。但是如果你开始思考Bruce Willis的角色是如何看待自己在童年时死亡的,以及这是如何激励他自愿参加时间旅行任务的,它扰乱了你的头脑,然后你就成为了一名javascript程序员。@westhels你就是下一个亚里士多德:D