2014-09-23 61 views
2

我碰到一個有趣的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函數內懸掛?
  • 提升過程中是否發生變量覆蓋?
+0

http://scribu.net/blog/javascript-var-keyword-for-php-developers.html - 「內部功能,所有未聲明的變量是全局性的,只有那些有var聲明的是本地的。」 – Radzikowski 2014-09-23 06:53:06

回答

3

暫時離開功能foo。在一個函數中,如果一個變量在該函數內的任何地方被聲明,聲明將被移到該函數的頂部。因此,它實際上是評估這樣

function bar() { 
    var foo; 
    return foo; 
    foo = 10; 
    foo = '11'; 
} 

但是如果你有同名聲明的函數,它將優先,並進行評估與此類似

function bar() { 
    var foo = function() {}; 
    return foo; 
    foo = 10; 
    foo = '11'; 
} 

這就是爲什麼你在警報框中獲得function

+0

謝謝,所以你的意思是說,在函數作用域對象只有一個屬性將創建名稱'富'? – Anshul 2014-09-23 07:14:11

+1

@pandit正好......您將在不同的時間點將不同的對象分配給相同的局部變量。 – thefourtheye 2014-09-23 07:15:01

0

默認情況下,函數內部沒有var的任何變量都將成爲全局變量。

當你在另一個函數內部有函數聲明時(如你的例子),它首先被掛起,然後是變量聲明。

示例演示變量覆蓋。

function bar() { 
    var foo = 10; 
    function foo() {} 
    return foo; 
} 

bar(); //--> returns 10; 

function bar() { 
    var foo; 
    function foo() {} 
    return foo; 
} 

bar(); //--> returns the function object foo. 
+0

感謝您的娛樂,但我認爲thefourtheye答案更準確。 – Anshul 2014-09-23 07:47:39