我得到了一些我无法理解的javascript解释器。
当变量在存储函数的参数中传递时,似乎是通过引用而不是通过值传递的。
此处是PoC:
var nb = 10;
var varfunc;
function myFunc(a) {
console.log("after = " + a);
}
console.log("before = " + nb);
varfunc = function() {
myFunc(nb)
};
nb = nb + 1;
varfunc();
我希望两个输出的值都为“ 10”。
在“ varfunc”变量上执行“设置”指令时,如何实际传递“ nb”值?
设置“ onClick”属性时遇到了此问题,在该属性中,我将函数与作为参数传递的全局变量链接在一起:
var global_var = 0;
...
function oneFunction(){
var delImg = document.createElement("img");
delImg.src = "images/delete.gif";
delImg.onclick = function(){
deleteFG(global_var);
};
...
}
...
oneFunction();
触发“ onClick”事件时,将使用当前值“ global_var”而不是处理“ onClick”的设置指令时的值来调用“ deleteFG()”函数。
我通过创建一个临时变量发现了一个肮脏的解决方案:
var global_var = 0;
...
function oneFunction(){
var delImg = document.createElement("img");
delImg.src = "images/delete.gif";
var tmp_var = global_var;
delImg.onclick = function(){
deleteFG(tmp_var);
};
...
}
...
oneFunction();
有人可以解释吗? :)
答案 0 :(得分:1)
我希望两个输出的值都为“ 10”。
首先,将nb
更改为11
。
然后您调用varfunc
来读取nb
(您已经更改过)的值,并将其(11
)传递给myFunc
。
这与引用无关。
如果要在创建函数时捕获值,则必须将其复制到另一个变量 。
您可以使用闭包来完成此操作(在此示例中,我使用IIFE创建一个)。
var nb = 10;
var varfunc;
function myFunc(a) {
console.log("after = " + a);
}
console.log("before = " + nb);
varfunc = function(copy_of_nb) {
return function() {
myFunc(copy_of_nb);
};
}(nb);
nb = nb + 1;
varfunc();
console.log("finally = " + nb);
答案 1 :(得分:0)
类似以下的事情应该起作用。由于nb
是全局变量,因此在您创建该函数时不会捕获它,而是在该函数实际运行时捕获。
基本上在您运行该函数时,即变量实际生效时。
以下代码基本上将该函数包装在该代码行上运行的另一个函数中,并传入nb
的当前值,而不是实际运行varfunc
函数时的值。
var nb = 10;
var varfunc;
function myFunc(a)
{
console.log("after = "+a);
}
console.log("before = "+nb);
var num2 = nb ;
varfunc= (function(a) {
return function(){
myFunc(a)
}
})(nb);
nb = nb + 1;
varfunc();