Javascript 未使用JS闭包将变量传递给onClick函数

Javascript 未使用JS闭包将变量传递给onClick函数,javascript,onclick,scope,closures,Javascript,Onclick,Scope,Closures,我通读了一遍 但我似乎无法让以下代码正常工作。正如您所看到的,我尝试了很多变化,无法将当前值传递给稍后将调用的函数 我希望在单击div时警报显示为“开始”而不是“结束”。。。 帮忙 var someString=“START”; document.getElementById('elem1')。onclick=function(){ 返回函数(someString){ 警报(someString); }(); }; document.getElementById('elem2')。onclic

我通读了一遍

但我似乎无法让以下代码正常工作。正如您所看到的,我尝试了很多变化,无法将当前值传递给稍后将调用的函数

我希望在单击div时警报显示为“开始”而不是“结束”。。。 帮忙

var someString=“START”;
document.getElementById('elem1')。onclick=function(){
返回函数(someString){
警报(someString);
}();
};
document.getElementById('elem2')。onclick=function(){
警报(someString);
};
document.getElementById('elem3')。onclick=function(){
警报(新字符串(someString));
};
document.getElementById('elem4')。onclick=function(someString){
返回函数(someString){
警报(someString);
}();
};
document.getElementById('elem5')。onclick=function(someString){
返回函数(){
警报(someString);
}();
};
document.getElementById('elem6')。onclick=function(){
var newSomeString=someString;
警报(newSomeString);
};
var someString=“END”

1.

2.
3.
4.
5.
6.

JavaScript在功能范围上是有限的。您正在将回调函数附加到所有这些侦听器,但在实际触发回调之前,不会执行回调函数。至此,您已经更改了消息的值

如果要封装作用域,有几个选项。例如,您可以将附加侦听器的逻辑包装为

您还可以将工作移动到准备就绪后运行的函数。下面是一个例子:

var someString = "START";

setListener();

function setListener(message) {
    message = message || someString;
    document.getElementById('elem1').onclick = function(){
        alert(message);
    };
}

var someString = "END";

问题在于代码何时执行。执行单击时,您已经更改了其值。下面的代码将起作用

var someString=“START”;
函数createCallback(){
var newSomeString=新字符串(someString);
返回函数(){
警报(newSomeString);
}
}
document.getElementById('elem')。onclick=createCallback();
someString=“END”

6.


谢谢!。。这是可行的,但是createCallBack()函数不是必需的。我想关键是在新函数的范围内创建一个新变量,其值从内部函数中设置。不过,为什么这不只是传递一个句柄给我不知道的初始someString呢。在java中,我会使用新字符串使它变得完全新。。。以下内容适用于我
document.getElementById('elem7')。onclick=function(){var newSomeString=someString;return function(){alert(newSomeString);}}}()
@RomanRekhler,是的,createCallBack函数只是我个人的偏好。在这两方面你都是对的。如果我没记错的话,字符串是JS中的基本对象。与Java一样,原语不被引用。@RomanaRekhler不确定您是否注意到我的答案(实际上在这个答案之前),但我解释了这个问题的答案,并给了您一个例子。我在那里的时候也修复了你的背景色css。不知道为什么我有时会费心回答。:)