2017-06-01 57 views
1

我遇到了一個特別有趣的例子,我認爲這是Javascript中的副作用。瞭解Javascript中的「副作用」與一流的功能

我試圖圍繞範圍和事實,功能是一流的公民。請讓我知道我是否在正確的軌道上,如果這是一個新手問題,請原諒我。

提及以下代碼:

let mrGlobal = "mrGlobal"; 
let drSideEffect = function() { 
    mrGlobal = "mrGlobal has been acting weird lately"; 
} 

function main(firstClassFunction) { 
    let mrGlobal = "mrGlobal: version 2."; 
    firstClassFunction 
    console.log(mrGlobal)     //First console.log 
} 
main(drSideEffect()); 
console.log(mrGlobal)      //Second console.log 

在第一consol.log的情況下,輸出是:mrGlobal版本2.
在第二consol.log的輸出的情況下是:最近mrGlobal一直很奇怪

我最初認爲這會導致opppsite行爲(第一個console.log與第二個console.log切換),所以這個輸出令我感到吃驚。我假設這是因爲JavaScript中的函數綁定到它們聲明的範圍,而不是執行它們的範圍 - 即使它們作爲一等公民被傳遞到該範圍內?

+0

另請參見https://stackoverflow.com/questions/44146107/inject-variables-into-function-scope –

+0

是的,原因是詞法範圍。這與一流的功能無關。 – Bergi

回答

0

首先,測試的一個小問題:您沒有將功能drSideEffect轉換爲main;你調用它,然後傳遞它的返回值(無)。 firstClassFunctionundefinedfirstClassFunction本身就是空操作。相反,把它在main

firstClassFunction(); 

和傳遞功能,而無需調用它:

main(drSideEffect); 

結果將是相同的,但是,因爲你是對的:功能繼承範圍,他們'被定義,而不是他們被稱爲的地方。