2
var foo = 'hello';
var myfunc = function() {
console.log(foo);
var foo = foo || 'world';
console.log(foo);
}
myfunc();
爲什麼第一個foo記錄爲'undefined'?javascript變量訪問的祕密
var foo = 'hello';
var myfunc = function() {
console.log(foo);
var foo = foo || 'world';
console.log(foo);
}
myfunc();
爲什麼第一個foo記錄爲'undefined'?javascript變量訪問的祕密
因爲在實際上用「var」聲明一個變量的行是不相關的,只要它保持在同一個函數中。如果函數在其中的任何位置聲明var x
,則對該名稱的任何引用都被認爲是聲明該範圍的本地範圍。
當然,通常你不引用它的聲明之前的變量,但考慮這個片段:
function foo(a) {
if (a) {
var b = "something";
}
console.log(b);
}
可變b
是局部的作用,因此不管的a
值,使用b
韓元的不會無意中引用在封閉範圍上聲明的變量。
注:javascript只有函數級別範圍,它沒有塊級別範圍。
+1,完全正確。更多信息:http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html – 2010-09-19 11:06:15
爲什麼你會在剛剛添加的代碼段中執行所做的操作?引入維護問題並沒有真正的好處。 – 2010-09-19 11:10:58
不,編譯器看到一個'var foo'語句並將foo編譯爲局部變量。然後,在解釋代碼時,foo尚未定義爲具有任何值。因此它的價值是'未定義的'。請記住,有兩個階段:編譯和執行。所有變量和函數聲明都是在編譯期間處理的。但是分配必須在執行過程中發生,因爲您需要評估表達式才能獲得正確的值。 – slebetman 2010-09-19 11:18:25