javascript - 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();
有人可以解释一下吗?:)
解决方案
我希望两个输出都有“10”值。
首先,您更改nb
为11
.
然后你调用varfunc
which 读取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);
推荐阅读
- python - 从文本中删除标点符号,然后作为字典存储在数据列中
- c# - 这会以异步并行方式运行吗?这是一种很好的编码实践吗?
- android - 发布应用程序时,是否可以从任何地方访问 SQLite?
- unity3d - IAP 计费订阅无法正常运行
- python - 使用跳过行在 Spark 中读取 csv
- apache-spark - Spark Local 获得比集群模式更好的性能
- c# - 如何访问存储在 PSObject 中的函数中的值?
- javascript - Angularjs - 在完成之前删除元素闪烁的指令
- xml - XSLT/XPATH - 查找列最多的表行
- c - 初始化的自动变量(局部变量)放在目标文件中的什么位置?