我今天遇到了一个奇怪的问题。
好处:我成功地在函数中更改了一个全局变量值(换句话说,当“passedVarName”被“a”替换时,下面的示例工作正常。)
坏:当尝试传递全局var名称“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>
答案 0 :(得分:2)
这是一个非常糟糕的Code Smell,但是如果你知道它是全局的,那么这将起作用:
var a = 1;
function click(passedVarName){
window[passedVarName]++;
document.write(passedVarName)
};
答案 1 :(得分:1)
单击此按钮可更改全局变量“a”。
这会将字符串'a'传递给您的函数,而不是变量a。
您需要将其作为click(a);
更正示例: http://html-bin.appspot.com/aghodG1sLWJpbnIMCxIEUGFnZRjhjxoM
[未使用jsfiddle.net通过分离javascript和HTML来避免混淆]
答案 2 :(得分: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/
答案 3 :(得分: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 }