首页 > 解决方案 > Javascript:在存储函数上通过引用传递的全局变量

问题描述

我得到了一些我对 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”变量上执行“set”指令时,如何实际传递“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”事件被触发时,“deleteFG()”函数以“global_var”的当前值被调用,而不是“onClick”的设置指令被处理时的值。

我通过创建一个临时变量找到了一个肮脏的解决方案:

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();

有人可以解释一下吗?:)

标签: javascriptparametersreference

解决方案


我希望两个输出都有“10”值。

首先,您更改nb11.

然后你调用varfuncwhich 读取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);


推荐阅读