2017-04-25 88 views
1

我發現在網絡這個簡短的JavaScript代碼片段:代碼在javascript中的return語句之後執行?

var foo = 1; 
function bar() { 
    foo = 10; 
    return; 
    function foo() {} 
} 
bar(); 
console.log(foo); 

我希望return語句後的內容功能巴()被忽略,和變量FOO末等於10 。然而,爲了我驚訝的是,控制檯輸出非常不同的東西:

1 

現在,當我刪除行return語句後

var foo = 1; 
function bar() { 
    foo = 10; 
    return; 
} 
bar(); 
console.log(foo); 

控制檯打印出來,符合市場預期:

10 

任何人都可以解釋我是什麼導致foo在前一版本的代碼中返回1?

回答

2

TL;博士這是由於如何函數表達式和函數聲明工作(另,功能提升):https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

更詳細的答覆:

把下面的console.log的代碼將幫助您可視化發生了什麼,我想回答你的問題。

var foo = 1; 
console.log('0', foo) 
function bar() { 
    console.log('1', foo) 
    foo = 10; 
    console.log('2', foo) 
    return; 
    console.log('3', foo) 
    function foo() {} 
    console.log('4', foo) 
} 
console.log('5', foo) 
bar(); 
console.log('6', foo) 

輸出如下:

'0' 1 
'5' 1 
'1' function foo() {} 
'2' 10 
'6' 1 

所以你懷疑,執行console.log( '3',FOO)和執行console.log( '4',FOO)永遠不會調用後,返回聲明,這是預期的。你現在的問題可能是「爲什麼我的console.log('1',foo)賦給函數foo(){}」,這可以用下面的SO問題來解答函數聲明和函數表達式,即

function foo(){} 

VS

var foo = function(){} 

Why can I use a function before it's defined in Javascript?

基本上被執行時bar,的foo立即定義變得功能(){},但這裏的關鍵概念是foo這個定義是本地在bar()函數內,並且在bar的範圍之外,它仍被指定爲1.

函數聲明和表達式的另一個很好的解讀:https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

+0

我接受這是正確的答案,因爲它是最全面的。謝謝! –

+0

@MarcinWasilewski我會說這是最長的。 –

2

正是由於hoisting

編譯器基本上都會把它轉換成:

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

於是就有了工作前的本地foo,你只覆蓋本地。功能foo()也將消失。

0

這是因爲代碼轉換爲;

var foo = 1; 
function bar() { 
    var foo; 
    foo = 10; 
    return; 
    function foo() {} 
} 
bar(); 
console.log(foo); 

這是因爲JavaScript總是將變量聲明和初始化移動到範圍的頂部。

相關問題