摘要:如果提升改變了代碼執(zhí)行的順序,會造成非常嚴(yán)重的破壞。聲明本身會被提升,而包括函數(shù)表達式的賦值在內(nèi)的賦值操作并不會提升。要注意避免重復(fù)聲明,特別是當(dāng)普通的聲明和函數(shù)聲明混合在一起的時候,否則會引起很多危險的問題
你不知道的JS(上卷)筆記
你不知道的 JavaScript
JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的 JavaScript 開發(fā)者,如果沒有認(rèn)真學(xué)習(xí)的話也無法真正理解它們.
上卷包括倆節(jié):
作用域和閉包
this 和對象原型
作用域和閉包希望 Kyle 對 JavaScript 工作原理每一個細節(jié)的批判性思 考會滲透到你的思考過程和日常工作中。知其然,也要知其所以然。
提升作用域同其中的變量聲明出現(xiàn)的位置有某種微妙的聯(lián)系
案例1
a = 2; var a; console.log( a ); // 在不了解聲明提升的情況下,你可能得出結(jié)果是undefined? 實際是2
案例2
console.log( a ); // 你可能由于案例1的影響,得出2,或者未聲明便使用,ReferenceError異常,實際上輸出 undefined var a = 2;
看看編譯器怎么說:
正確的思考思路是,包括變量和函數(shù)在內(nèi)的所有聲明都會在任何代碼被執(zhí)行前首先 被處理。
編譯 -> 解釋js代碼 -> 執(zhí)行
只有聲明本身會被提升,而賦值或其他運行邏輯會留在原地。如果提升改變了代碼執(zhí)行的順序,會造成非常嚴(yán)重的破壞。
函數(shù)聲明會被提升,但是函數(shù)表達式卻不會被提升。
foo(); // 不是 ReferenceError, 而是 TypeError! var foo = function bar() { // ... };
foo()調(diào)用執(zhí)行時,foo 此時并沒有賦值(如果它是一個函數(shù)聲明而不 是函數(shù)表達式,那么就會賦值)。foo() 由于對 undefined 值進行函數(shù)調(diào)用而導(dǎo)致非法操作, 因此拋出 TypeError 異常。
函數(shù)優(yōu)先函數(shù)聲明和變量聲明都會被提升,但是函數(shù)會首先被提升,然后才是變量。
一個普通塊內(nèi)部的函數(shù)聲明通常會被提升到所在作用域的頂部,這個過程不會像下面的代 碼暗示的那樣可以被條件判斷所控制:
foo(); // "b" var a = true; if (a) { function foo() { console.log("a"); } } else { function foo() { console.log("b"); } }小結(jié)
我們習(xí)慣將var a = 2;看作一個聲明,而實際上JavaScript引擎并不這么認(rèn)為。它將var a
和 a = 2 當(dāng)作兩個多帶帶的聲明,第一個是編譯階段的任務(wù),而第二個則是執(zhí)行階段的任務(wù)。
這意味著無論作用域中的聲明出現(xiàn)在什么地方,都將在代碼本身被執(zhí)行前首先進行處理。 可以將這個過程形象地想象成所有的聲明(變量和函數(shù))都會被“移動”到各自作用域的 最頂端,這個過程被稱為提升。
聲明本身會被提升,而包括函數(shù)表達式的賦值在內(nèi)的賦值操作并不會提升。 要注意避免重復(fù)聲明,特別是當(dāng)普通的 var 聲明和函數(shù)聲明混合在一起的時候,否則會引起很多危險的問題!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101517.html
摘要:詞法作用域的查找規(guī)則是閉包的一部分。因此的確同閉包息息相關(guān),即使本身并不會真的使用閉包。而上面的創(chuàng)建一個閉包,本質(zhì)上這是將一個塊轉(zhuǎn)換成一個可以被關(guān)閉的作用域。結(jié)合塊級作用域與閉包模塊這個模式在中被稱為模塊。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的 Jav...
摘要:如果是聲明中的第一個詞,那么就是一個函數(shù)聲明,否則就是一個函數(shù)表達式。給函數(shù)表達式指定一個函數(shù)名可以有效的解決以上問題。始終給函數(shù)表達式命名是一個最佳實踐。也有開發(fā)者干脆關(guān)閉了靜態(tài)檢查工具對重復(fù)變量名的檢查。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的 Ja...
摘要:詞法作用域定義在詞法階段的作用域由你在寫代碼時將變量和塊作用域?qū)懺谀膩頉Q定的,因此當(dāng)詞法分析器處理代碼時會保持作用域不變。欺騙詞法作用域在詞法分析器處理過后依然可以修改作用域。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的 JavaScript 開發(fā)者,如果沒...
摘要:的抽象語法樹中可能會有一個叫作的頂級節(jié)點,接下來是一個叫作它的值是的子節(jié)點,以及一個叫作的子節(jié)點。值得注意的是,是非常重要的異常類型。嚴(yán)格模式下,未聲明的和倆者行為相同,都會是。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的 JavaScript 開發(fā)者,如果...
摘要:上一篇文章第三章概念及應(yīng)用第三節(jié)客戶端編程下一篇文章第四章網(wǎng)站部署第二節(jié)靜態(tài)文件之前著重講解的編程知識點,所有之前的例子都使用最簡單的啟動方式運行。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第三節(jié):客戶端編程下一篇文章:Python:Tornado 第四章:Tornado網(wǎng)站部署:第二節(jié):靜態(tài)文件 之前著重講解Tornado的編程知...
閱讀 1784·2021-09-22 15:25
閱讀 1332·2019-08-29 12:34
閱讀 1950·2019-08-26 13:57
閱讀 3227·2019-08-26 10:48
閱讀 1470·2019-08-26 10:45
閱讀 823·2019-08-23 18:23
閱讀 764·2019-08-23 18:01
閱讀 1975·2019-08-23 16:07