我碰到一個有趣的quiz在JavaScript中如何提升名稱解析順序?
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = '11';
}
alert(typeof bar());
我的理解是這樣來了(其中根據錯誤的安慰:)是):
var foo; // global variable
function bar(){
function foo(){}
var foo; // Here variable foo should override foo function
return foo; // (according to me foo should be variable with undefined value) What is going on here, How JavaScript resolve naming order ?
foo = 10;
foo = "11";
}
這是我讀this
參考在JavaScript中,名稱以四種基本方式之一進入作用域: 1.語言定義:所有作用域都是,默認情況下,給定名稱和參數。 2.形式參數:函數可以命名形式參數,其範圍是該函數的主體。 3.函數聲明:這些函數的形式函數foo(){}。 4.變量聲明:它們的形式爲var foo;
後來他引述:
最重要的特殊情況,以記住的是名稱解析順序。請記住名稱有四種進入給定範圍的方式。我在上面列出的順序是它們被解析的順序。一般來說,如果一個名稱已經被定義,它將永遠不會被另一個同名的屬性覆蓋。這意味着函數聲明優先於變量聲明。這並不意味着對該名稱的分配將不起作用,只是聲明部分將被忽略。
這是混淆了我,任何人都可以參考簡化這上面的例子? 要點:我想知道:
- 如何變量沒有
var
函數內懸掛? - 提升過程中是否發生變量覆蓋?
http://scribu.net/blog/javascript-var-keyword-for-php-developers.html - 「內部功能,所有未聲明的變量是全局性的,只有那些有var聲明的是本地的。」 – Radzikowski 2014-09-23 06:53:06