[英]Registering Variables and Functions Declarations in Java Script
我正在觀看一個關於javascript范圍的視頻,它說在瀏覽器解釋java腳本代碼之前,它實際上涉及一個快速的編譯步驟(很可能不是'編譯',因為它不涉及制作中間文件),它注冊變量和功能聲明在各自的范圍內。 所以,如果我寫:
var a = 3;
function foo(){
var c = 2;
}
在評估上述表達式(即忽略RHS部分)之前,變量'a'和函數'foo'將在全局范圍內注冊,並且在'foo'范圍內,變量'c'將被注冊。 在此編譯步驟之后,將評估表達式的值。
但是當我們寫下時會發生什么:
var a = function(){
var c;
}
編譯步驟是否只在全局范圍內注冊變量'a'並跳過函數聲明和變量'c'聲明,因為編譯步驟應該跳過RHS部分並且評估表達式出現在解釋器部分?
實際上,我后來想通了。 這是吊裝。 提升僅適用於變量和函數聲明,而不適用於函數表達式。 事實證明,函數表達式及其局部變量中唯一的函數被注冊的時間是java腳本解釋器運行時(編譯后),因為編譯步驟不會打擾它們,因為它們位於RHS部分。 這確保了在函數表達式的情況下,我們只在賦值后調用它,並且解釋器負責在全局范圍中注冊的函數,將它分配給LHS變量並聲明其局部變量(var bar;):
var foo = function() { console.log(bar); var bar = 5; }; foo();
僅當解釋器到達此行時才會創建此函數對象:
var foo = function abc() {
這是一個函數聲明的例子,如下所示:
foo(); function foo() { console.log(bar); var bar = 5; }
吊裝會確保在編譯步驟中它注冊函數'foo'並在其范圍內聲明變量'bar'。
盡管如此,這兩個項目都會給出相同的輸出 - “未定”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.