2017-08-17 34 views
1

請解釋這兩種行爲背後的邏輯是否容易理解。兩個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;

+0

範圍。函數foo首先檢查其範圍是否定義了'a',如果沒有在外部範圍中檢查等等 – Avinash

回答

0

由於範圍

在Javascript中,當你在一個函數指定一個參數,你在該函數的範圍定義它,無論如果一個變量已經與外/全球範圍內名稱存在。

更新:

值得一提的是,與ES6的箭頭功能你仍然可以訪問你的函數是在一個父類或函數定義,使用this關鍵字外變種。

class Bar { 

    this.a = 10; 

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

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

} 

不完全一樣,但它是關於範圍

0

在JavaScript中,函數變量都有自己的範圍,如果你使用的變種,讓,const或使用變量作爲正式提供參數在功能。如果你不使用任何以上變量的範圍將是全球性的。

1

在函數的第一個例子a正在取代的a第一次申報的功能之外,因爲你不var(或letconst)本地範圍界定它。

在第二個示例中,該函數接受a作爲參數,因此它變爲本地範圍的函數。請注意,即使a未實際傳遞到函數(因此undefined),也會發生

A good article on scope and context這可能對您有些用處。

1

檢查下面的代碼片段

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

第一個是因爲全球範圍內

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

這裏varieble被globaly accesed並從內部更新功能全局變量可以訪問每個地方

在第二個例子

只是路過varieble一個的referece作爲參數,函數內部的recived參數值得到改變

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

請運行的控制檯代碼的第二個例子,你可以理解變化。