0

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

好处:我成功地从一个函数中更改了一个全局 var 值(换句话说,当“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>
4

4 回答 4

2

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

var a = 1;

function click(passedVarName){

    window[passedVarName]++;

    document.write(passedVarName)

};
于 2012-04-20T05:47:16.960 回答
1

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

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

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

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

于 2012-04-20T05:44:15.853 回答
0

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

每次单击第一个 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/

于 2012-04-20T06:03:48.740 回答
0

如果我误解了您的编程知识,请原谅我,但是全局变量是可以由您的编程的任何部分访问和修改的东西,您不需要通过函数传递它来修改它。

如果您尝试通过函数修改全局变量,则 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 }
于 2012-04-20T07:45:35.953 回答