2017-08-17 4 views
1

この2つのタイプの動作の背後にあるロジックを簡単に理解してください。2つのJavaScript関数のふるまいの背後にあるロジック

var a = 10; 
function foo(){ 
    a = 20; 
} 
foo(); 
console.log(a); 

プリント---> a = 20;

var a = 10; 
function foo(a){ 
     a = 20; 
} 
foo(); 
console.log(a); 

印刷---> a = 10;あなたは変数がすでにグローバル/外側のスコープに名前で存在かどうかに関係なく、その関数のスコープで定義する機能でパラメータを割り当てるためのスコープJavaScriptで

+0

スコープ。関数fooは最初に 'a'が定義されているかどうかをチェックし、外側のスコープでチェックしていなければチェックします。 – Avinash

答えて

0

、。

更新:

あなたの関数は、このキーワードを使用して、親クラスまたは関数で定義されていた場合ES6の矢印機能を使用すると、まだ外VARにアクセスすることができることを言及する価値があります。

class Bar { 

    this.a = 10; 

    this.foo = function(a) { 
     this.a = 20;  
    }; 

    this.foo2 = (a) => { 
     this.a = 20; 
    }; 

} 

ないまったく同じJavaScriptでスコープ

0

、機能変数について正式に提供されているように、独自のスコープを持っているあなたはVARを使用した場合、聞かせて、CONSTまたは変数を使用しています関数のパラメータ。上記の変数のスコープを使用しない場合は、グローバルになります。あなたがvar(またはletまたはconst)と、ローカルにスコープしていないので、関数の最初の例a

1

は、関数の外aの最初の宣言を置き換えています。

第2の例では、この関数は引数としてaを受け入れるため、関数に対してローカルスコープになります。aが実際に関数に渡されていない(したがってundefined)場合でも、これはになります。

A good article on scope and contextこれはご使用の場合があります。

1

グローバルにaccesedと内側から更新されvariebleここ

var a =10; function foo(){ a= 20; }

最初のものがあるため、グローバルスコープであり、次のコードスニペット

var a =10; 
 
var b = a; 
 
function foo(a){ 
 
     // a here woukd refer to the parameter a and not the global variable, since it got overridden 
 
     console.log(a, b); 
 
     a= 20; 
 
} 
 
foo(); 
 
// prints the global variable a 
 
console.log(a); 
 

 
function bar(){ 
 
     console.log(a, b); 
 
     // overrides the global variable a 
 
     a = 20; 
 
} 
 

 
bar(); 
 
// prints the global variable a 
 
console.log(a);

1

をチェック機能グローバルな静脈はすべての場所にアクセスできますそして、あなたが変更を理解することができる第二の例では は、単にパラメータとしてvarieble aのrefereceを渡すと、関数内recivedパラメータ値は

var a =10; 
function foo(a){ 
a= 20; 
console.log(a) 
} 
foo(); 
console.log(a); 

コンソールのコードの第2の例を実行してください変更を取得します。

関連する問題