2012-04-20 7 views
0

今日、私は奇妙な問題に遭遇しました。varを変更する関数へのグローバルvarの名前を渡しますか?

良い:関数内からグローバルvar値を正常に変更しました(つまり、 "passedVarName"を "a"で置き換えた場合、下の例は正常に動作します)。

悪い:グローバル変数 "a"(関数に直接入れるのではなく)を渡そうとするとうまく動作しません。

Javascriptを

(クリック文書に "2" を書くべきではなく "はNaNを" 書くでしょうか?):以下

は、私が働いて得るように見えることができないものです

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

ご迷惑をおかけいたします。Click this Button to alter global var "a".。 – user1345660

答えて

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

1

このボタンをクリックすると、グローバル変数 "a"が変更されます。

これは、変数aではなく文字列 'a'を関数に渡します。 あなたのようにそれを渡す必要がclick(a);

正しい例: http://html-bin.appspot.com/aghodG1sLWJpbnIMCxIEUGFnZRjhjxoM

+0

正確には、NaNは「Not a Number」を意味します(文字列を増やすことはできません...) –

2

これはかなり悪いコードのにおいです[はseperating JavaScriptとHTMLによる混乱を避けるためにjsfiddle.netを使用していませんでした]が、

+0

トリックをしてくれてありがとう!何が悪臭を覚えるか気にしない? :)私は非常にクリーンな選択肢に感謝したいと思います。 – user1345660

+0

@ user1345660この場合、悪いコードの匂いは、パラメータとして渡された変数への参照を使用するのではなく、 'window'オブジェクトへの明示的な参照を意味します。 @DhruvPathatは既にあなたのコードでエラーを指摘し、実際の例を与えました。 –

+0

はい、彼の例では、変数自体ではなく、関数に渡される値だけを変更しています。実際のグローバル変数は残念ながら1にとどまっています。これがwindow [passedVarName]が必要な理由です。 – user1345660

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 } 
関連する問題