Javascript:存储函数通过引用传递的全局变量

时间:2019-01-08 16:43:13

标签: javascript parameters reference

我得到了一些我无法理解的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();

有人可以解释吗? :)

2 个答案:

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