如果我們將JavaScript引擎的操作劃分爲編譯階段(其中設置了整個詞法範圍圖),Vs運行階段(其中代碼是在編譯階段使用詞法範圍設置來執行的),範圍爲函數表達式設置?它是在編譯還是運行/解釋階段?函數表達式的詞法範圍
此外,無論何時設置函數表達式的作用域,父作用域始終是全局作用域的權利? (我看過這個代碼,只是想確認一下)。
如果我們將JavaScript引擎的操作劃分爲編譯階段(其中設置了整個詞法範圍圖),Vs運行階段(其中代碼是在編譯階段使用詞法範圍設置來執行的),範圍爲函數表達式設置?它是在編譯還是運行/解釋階段?函數表達式的詞法範圍
此外,無論何時設置函數表達式的作用域,父作用域始終是全局作用域的權利? (我看過這個代碼,只是想確認一下)。
將範圍想象爲函數的層次結構更容易。如果你正在定義你的第一個函數a(),它的父範圍將是全局範圍。用()定義的每個函數都可以訪問a()的作用域和全局作用域。在功能樹上的每一個後代可以訪問到它的父範圍,根是在全球範圍內
的功能(包括函數表達式)範圍設置時的功能創建 - 這發生在運行階段,而不是解析階段。
函數表達式的作用域是在運行階段(我猜是映射到我的問題的編譯階段)設置的?如果可能的話,可否請您轉發一篇提及此事的鏈接/文章。 –
鑑於JS是一種帶有優化編譯器的解釋型語言,「階段」無論如何都沒有太大意義。只有解析到AST,然後執行。其中包括設置功能和編譯他們的身體。 – Bergi
我想你可能會混淆一些不同的東西。這裏有兩篇很好的文章可能有幫助:[Javascript Scope and Closures](https://spin.atomicobject.com/2014/10/20/javascript-scope-closures/),[Function Scope and Lexical Scoping]( http://pierrespring.com/2010/05/11/function-scope-and-lexical-scoping/)。特別注意關於「調用,綁定和應用」的部分, – paulsm4