2016-07-27 63 views
5

下面的代碼在Browser和Node.js中會有所不同。Native瀏覽器和Node.js中的JavaScript函數聲明獲得不同的結果

瀏覽器的結果是a

Node.js的結果是b

if (1) { 
    function foo() { return 'a'; } 
} else { 
    function foo() { return 'b'; } 
} 

console.log(foo()); 

儘管這種代碼風格是反模式,但代碼仍然可以在環境中運行。

如何解釋?


僅供參考。

這些鏈接可能不是永久性的。

+2

塊中的函數聲明不達標據我所知,所以你不應該期望的行爲是相同的不同實現。 – elclanrs

回答

0
if (1) { 
    foo(); 
} else { 
foo1(); 
} 
function foo() { return 'a'; } 
function foo1() { return 'b'; } 
console.log(foo()); 

塊中的函數行爲可能不同。上面的代碼完美地按預期工作。

+0

感謝您的回覆。但我想知道爲什麼結果會不同,而不是獲得更好的編碼風格。 :) – Husky

+0

請參閱下面的鏈接更多解釋'http://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements' –

1

好的,所以我查看了你的代碼,並在本機瀏覽器和nodeJS上進行了分析。據我所知,在節點中,第二個聲明中具有相同名稱的函數被覆蓋,但在本地瀏覽器JavaScript中不是這種情況。爲了進一步看看這兩個環境的工作使用下面的代碼,你會看到其中的差別:

if (1) { 
    console.log('In condition 1'); 
    function foo() { 
     console.log('Inside first declaration'); 
     return 'a'; 
    } 
} else { 
    console.log('In condition 2'); 
    function foo() { 
     console.log('Inside second declaration'); 
     return 'b'; 
    } 
} 

console.log(foo()); 
相關問題