将全局变量的名称传递给更改变量的函数

Pass name of global var to function that alters var?

本文关键字:改变 变量 函数 全局变量      更新时间:2023-09-26

我今天遇到了一个奇怪的问题。

好处:我成功地从函数中更改了全局变量值(换句话说,当"passedVarName"替换为"a"时,下面的示例工作正常)。

坏处:当尝试传递全局变量名称"a"(而不是直接将其放入函数中)时,它无法正常工作。

以下是我似乎无法工作的内容:

(点击文档应该写"2",而是写"NaN"?

Javascript:

  var a = 1;
  function click(passedVarName){
     passedVarName ++;
     document.write(passedVarName)
  };

.HTML:

<a href="javascript:click('a')">Click this Button to alter global var "a".</a>

这是一个非常糟糕的代码气味,但如果你知道它是全局的,那么这将起作用:

var a = 1;
function click(passedVarName){
    window[passedVarName]++;
    document.write(passedVarName)
};

单击此按钮可更改全局变量 "a"。

这会将字符串"a"传递给您的函数,而不是变量 a。您需要将其作为click(a);传递

更正的示例:http://html-bin.appspot.com/aghodG1sLWJpbnIMCxIEUGFnZRjhjxoM

[ 没有使用 jsfiddle.net 来避免混淆 通过分离 javascript 和 HTML ]

将全局变量作为参数传递给函数会在函数中创建该变量的副本。全局不会改变。

此示例将在每次单击第一个div 时生成相同的输出:

//html
<div onclick="foo(a)">Click here</div>
<div id="txt"></div>​​​​​​​​​​​​​
//js
window.a = 152;
window.foo = function(varr) {varr++; $("#txt").html(varr)}​

但是,如果您将变量作为对象的属性传递,将该对象传递给函数,并在函数内部修改变量,则似乎具有全局效果:

//html
<div onclick="foo(a)">Click here</div>
<div id="txt"></div>​​​​​​​​​​​​​​​​
//js
window.a = { val:152};
window.foo = function(varr) {varr.val++; $("#txt").html(varr.val)}​

这是一个有效的jsFiddle:http://jsfiddle.net/2Ahdb/3/

如果我

误解了您的编程知识,请原谅我,但是全局变量是可以被编程的任何部分访问和修改的东西,您无需通过函数传递它即可对其进行修改。

如果你尝试通过函数修改全局变量,javascript 有一些限制。 仅通过引用传递对象。

var a = 5;
var b = { value: 5 };

function changeMe(x) {
   x = 10;
}
changeMe(a); //... still 5
function changeMeAlso(x) {
   x.value = 10;
}
changeMeAlso(b); //.. changed to { value: 10 }