成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 變量提升

li21 / 2525人閱讀

摘要:生命周期假設(shè)這樣一個場景當(dāng)解釋器剛進(jìn)入一個包含的作用域時,則在任何語句執(zhí)行之前,變量就已完成了聲明階段和初始化階段,且值為。當(dāng)解釋器執(zhí)行完,變量就已完成了初始化階段,離開了臨時死區(qū),并具有的值。

變量提升是一個將變量聲明或者函數(shù)聲明提升到作用域起始處的過程。在本篇博文中,我們一起深入了解這個過程的更多細(xì)節(jié)。

變量的生命周期

當(dāng)引擎使用變量時,它們的生命周期包含以下階段:

聲明階段,這一階段在作用域中注冊了一個變量

初始化階段, 這一階段分配了內(nèi)存并在作用域中讓內(nèi)存與變量建立了一個綁定,變量會被自動初始化為 undefined

賦值階段,這一階段為已初始化的變量分配具體的一個值

注意,聲明階段與我們通常所說的變量聲明是不同的術(shù)語。

var 生命周期

假設(shè)這樣一個場景:當(dāng)解釋器剛進(jìn)入一個包含 var variable 的作用域時,則在任何語句執(zhí)行之前,變量就已完成了聲明階段初始化階段,且值為 undefined。語句 varibale = "value"賦值階段。

// 在剛進(jìn)入到 func 作用域時,a 已完成了聲明和初始化階段,且值為 undefined
function func() {
  console.log(a); // undefined
  var a = 1; // 賦值階段
  console.log(a); // 1
}
func();
function 生命周期

對于 function ,聲明、初始化和賦值階段在解釋器剛進(jìn)入函數(shù)作用域時,便已全部完成。

可以結(jié)合以下的代碼,去理解 function 的變量提升過程。

// function 提升優(yōu)先級比 var 和 let 高
foo(); // 2

// 具名函數(shù)表達(dá)式的函數(shù)名只在函數(shù)內(nèi)部有效
bar(); // ReferenceError

function foo() {
  console.log(1);
}

// 多個函數(shù)聲明時,后面的函數(shù)聲明會覆蓋之前的函數(shù)聲明
function foo() {
  console.log(2);
}

// 函數(shù)聲明會被提升,但函數(shù)表達(dá)式不會被提升
var foo = function bar() {
  console.log(3);
};

foo(); // 3
let 變量的生命周期

let 的提升是只針對聲明階段的提升。

假設(shè)這樣一個場景:當(dāng)解釋器剛進(jìn)入一個包含 let variable 的作用域時,就已完成了聲明階段。

從聲明階段結(jié)束到初始化階段開始, 這段區(qū)域被稱為臨時死區(qū)。如果在這時訪問 variable ,將會拋出 ReferenceError: variable is not defined 。

當(dāng)解釋器執(zhí)行完 let variable ,變量就已完成了初始化階段,離開了臨時死區(qū),并具有 undefined 的值。之后的語句 variable = "value"賦值階段。

如果解釋器遇到了 let variable = "value" ,則完成了初始化賦值階段。

總結(jié)

至此,總結(jié)一下變量提升過程中的一些重要知識點:

var 只有聲明階段初始化階段被提升

function聲明階段初始化階段賦值階段都被提升

let 只有聲明階段被提升

function 提升優(yōu)先級比 varlet 高,且對于多個函數(shù)聲明,后面的聲明會覆蓋前面的聲明

函數(shù)表達(dá)式無法被提升

參考資料

JavaScript variables lifecycle: why let is not hoisted

我用了兩個月的時間才理解 let

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100291.html

相關(guān)文章

  • Javascript中的變量提升、函數(shù)提升變量訪問原則

    摘要:變量提升什么是變量提升在函數(shù)體內(nèi)聲明的變量,無論你是在函數(shù)的最底端還是中間聲明的,那么都會把該變量的聲明提升到函數(shù)的最頂端相當(dāng)于第一行,但是只是提升變量的聲明,不會賦值。 1、變量提升 什么是變量提升?在函數(shù)體內(nèi)聲明的變量,無論你是在函數(shù)的最底端還是中間聲明的,那么都會把該變量的聲明提升到函數(shù)的最頂端(相當(dāng)于第一行),但是只是提升變量的聲明,不會賦值。 var num = 10; fu...

    zhigoo 評論0 收藏0
  • JavaScript變量提升

    摘要:發(fā)布自的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在的個人的知識整理倉庫,歡迎投稿介紹變量提升是人們對執(zhí)行上下文工作方式的一種認(rèn)識,并不是官方給出的改變從字面上理解,變量提升的意思是變量和函數(shù)的聲明會在物理層移動到作用域的最前 發(fā)布自Kindem的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在Kindem的個人的 IT 知識整理倉庫,歡迎 Star、Fork、...

    yzd 評論0 收藏0
  • ES6 變量作用域與提升變量的生命周期詳解

    摘要:不同的是函數(shù)體并不會再被提升至函數(shù)作用域頭部,而僅會被提升到塊級作用域頭部避免全局變量在計算機(jī)編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與實踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對象以及如何避免創(chuàng)建...

    lmxdawn 評論0 收藏0
  • JavaScript 變量聲明提升

    摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個小例子 先來看個例子: console.log(a); // undefined var a =...

    fireflow 評論0 收藏0
  • JavaScript變量提升

    摘要:變量提升需要注意兩點提升的部分只是變量聲明,賦值語句和可執(zhí)行的代碼邏輯還保持在原地不動提升只是將變量聲明提升到變量所在的變量范圍的頂端,并不是提升到全局范圍,說明如下會輸出變量提升之后的效果函數(shù)聲明會提升,但是函數(shù)表達(dá)式就不了。 問題 有些朋友可能會覺得javascript的代碼是從上到下,一行一行的解釋執(zhí)行的。如果按照這樣的思路,在有些情況下閱讀代碼會得到錯誤的結(jié)果,考慮以下代碼: ...

    Zoom 評論0 收藏0
  • javascript聲明提升

    摘要:但是碰到聲明提升,這種想法就會被打破。聲明一個函數(shù)進(jìn)行相應(yīng)的操作,會得到函數(shù)聲明提升的結(jié)果。由此可以發(fā)現(xiàn)變量和函數(shù)的聲明都會被提升在其他代碼的前面執(zhí)行。一個普通塊內(nèi)部的函數(shù)聲明通常會被提升到所在的作用域的頂部。的創(chuàng)建初始化和賦值均會被提升。 Javascript聲明提升 在分析聲明提升之前,我認(rèn)為有必要知道的兩點: 一、引擎查詢變量的兩種方式 引擎查詢變量的方式可以分為LHS和RHS兩...

    evin2016 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<