請解釋這兩種行爲背後的邏輯是否容易理解。兩個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函數行爲背後的邏輯
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中,當你在一個函數指定一個參數,你在該函數的範圍定義它,無論如果一個變量已經與外/全球範圍內名稱存在。
更新:
值得一提的是,與ES6的箭頭功能你仍然可以訪問你的函數是在一個父類或函數定義,使用this關鍵字外變種。
例
class Bar {
this.a = 10;
this.foo = function(a) {
this.a = 20;
};
this.foo2 = (a) => {
this.a = 20;
};
}
不完全一樣,但它是關於範圍
在JavaScript中,函數變量都有自己的範圍,如果你使用的變種,讓,const或使用變量作爲正式提供參數在功能。如果你不使用任何以上變量的範圍將是全球性的。
在函數的第一個例子a
正在取代的a
第一次申報的功能之外,因爲你不var
(或let
或const
)本地範圍界定它。
在第二個示例中,該函數接受a
作爲參數,因此它變爲本地範圍的函數。請注意,即使a
未實際傳遞到函數(因此undefined
),也會發生。
A good article on scope and context這可能對您有些用處。
檢查下面的代碼片段
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);
第一個是因爲全球範圍內
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);
請運行的控制檯代碼的第二個例子,你可以理解變化。
範圍。函數foo首先檢查其範圍是否定義了'a',如果沒有在外部範圍中檢查等等 – Avinash