2012-04-20 60 views
0

今天我遇到了一个奇怪的问题。将全局变量var的名称传递给函数以改变var?

好:我成功地从一个函数内改变了一个全局var值(换句话说,当“passedVarName”被替换为“a”时,下面的例子工作正常)。

糟糕:当试图传递全局变量名称“a”(而不是直接将其放入函数中)时,它无法工作。

下面是表里如一,我不能让工作:

(上点击文件应该写 “2”,而是写 “南”?)

的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

道歉HTML应该读取:Click this Button to alter global var "a".。 – user1345660 2012-04-20 05:37:02

回答

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/

+0

不错的工作!这看起来像在我的函数中使用“window []”的一个很好的干净选择。谢谢! – user1345660 2012-04-20 17:21:11

1

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

这将字符串'a'传递给你的函数,而不是变量a。 你需要把它作为click(a);

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

[未使用jsfiddle.net被分隔条件JavaScript和HTML,以避免混淆]

+0

准确地说,NaN的意思是'不是数字'(你不能增加一个字符串......) – 2012-04-20 05:45:12

2

这是一个非常糟糕的代码味道,但如果你知道这是全球性的,那么这会工作:

var a = 1; 

function click(passedVarName){ 

    window[passedVarName]++; 

    document.write(passedVarName) 

}; 
+0

谢谢你做到了!如果你不介意是什么让它闻起来不好? :)我非常感谢一个更清洁的替代品。 – user1345660 2012-04-20 05:52:17

+0

@ user1345660在这种情况下,不好的代码味道我相信指的是对'window'对象的显式引用,而不是使用对作为参数传入的变量的引用。 @DhruvPathat已经在你的代码中指出了错误,并给了你一个工作的例子。 – 2012-04-20 07:41:18

+0

是的,但在他的例子中,他只是改变传递给函数的值,而不是变量本身。实际的全局变量不幸保持在1.这就是为什么window [passedVarName]似乎是必要的。 – user1345660 2012-04-20 16:59:58

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 }