2016-10-30 19 views
0

まず最初に一見尋ねられたことは申し訳ありませんが、 質問にはスコープについての話があります私はそのコンセプトに精通しています)、あるいは私が実際に理解していない「コールバック」や「非同期」なものについても、理解しています。私がこれを尋ねる理由は、今までの私のグローバル変数が、通常、非常に多くの関数の影響を受けていたからです。 私が持っているコードはあまりにも大きすぎてここに貼り付けることはできませんが、私は例を挙げます。私は関数に渡すときグローバルスコープのグローバル変数の影響を受けない関数で渡される

var ContainsSomeNumber = 50; 
var AnObjectWithSomeValues ... 
var TheFunctionInQuestion = function(nameRepresentingTheObject, nameRepresentingNumberVar){ 
    if(nameRepresentingTheObject.lestSayName ==== "SomeString"){ 
     nameRepresentingNumberVar+=5; 
    } 
} 

今の事は、それは両方の変数を理解し、正しい結果を取得している、しかし、ContainsSomeNumber変数は、グローバル規模での機能による影響を受けないまま。私が機能の中にどれくらいのものがあるかを私に知らせるためにアラートやログを記録すると、それは55のように表示されます。しかし、いったん関数が正常に実行された後に変更された値を持つ別の場所で変更されたグローバル変数にアクセスしようとすると(chromeとfirefoxはファウルを示さない)、同じ未変更値50を返します。 私はdidn関数に渡す変数のハードコード版を使用しない、または何を?私が言ったように、それは正しい方法を見て変更しますが、機能の中だけです。私が関数で使用したものの前に "var"を書かなかったので、変数をグローバル変数としてスコープしてはいけませんか?つまり、私はそれを新しい変数として宣言しておらず、通常はグローバルな値をとっていました。グローバル変数が関数によって変更されたままになっていないのはなぜですか?

+0

は、あなたが実際に私が変数の値 – amdouglas

+0

@amdouglasをチェックする前に機能を実行している、と私は関数自体の内部でそれをチェックするとき、それは変更されしかし、関数が実行された直後に、私はアラートを介してチェックインするか別の場所にログインし、影響を受けていないように見えます。 –

+0

@IhateJS複製を読む...これは多くの言語のプリンシパルです。 – Li357

答えて

0

JavaScriptは常に値渡しですが、変数がオブジェクト(配列を含む)を参照する場合、「値」はオブジェクトへの参照です。 スコープ外の変数を関数に変更したい場合は、オブジェクトを渡してそのオブジェクトの中のいくつかの属性を変更する必要があります。

var obj = { 
    ContainsSomeNumber: 50; 
} 
var AnObjectWithSomeValues ... 
var TheFunctionInQuestion = function(nameRepresentingTheObject, obj){ 
    if(nameRepresentingTheObject.lestSayName === "SomeString"){ 
     obj.ContainsSomeNumber+=5; 
    } 
} 

またはあなたが値を返すことができます。

var ContainsSomeNumber = 50; 
var AnObjectWithSomeValues ... 
var TheFunctionInQuestion = function(nameRepresentingTheObject, nameRepresentingNumberVar){ 
    if(nameRepresentingTheObject.lestSayName === "SomeString"){ 
     nameRepresentingNumberVar+5; 
    } 
    return nameRepresentingNumberVar 
} 
関連する問題