你不知道的javascript--上捲--讀書筆記1

来源:http://www.cnblogs.com/sanxiaoshan/archive/2017/04/01/6657508.html
-Advertisement-
Play Games

作用域是什麼? 作用域是什麼? 答:在《你不知道的javascript》書中提到,作用域就是根據名稱查找變數的一套規則。古語有“無規矩不成方圓”,但是沒有方圓,規矩又給誰用?所以個人理解作用域就是“規矩”+”方圓“。 書中提到作用域共有兩種主要的工作模型。第一種是詞法作用域,另外一種叫作動態作用域。 ...


  • 作用域是什麼?

  答:在《你不知道的javascript》書中提到,作用域就是根據名稱查找變數的一套規則。古語有“無規矩不成方圓”,但是沒有方圓,規矩又給誰用?所以個人理解作用域就是“規矩”+”方圓“。

    書中提到作用域共有兩種主要的工作模型。第一種是詞法作用域,另外一種叫作動態作用域。

    詞法作用域是由你在寫代碼時將變數和塊作用域寫在哪裡來決定的,因此當詞法分析器處理代碼時會保持作用域不變(大部分情況下是這樣的)。無論函數在哪裡被調用,也無論它如何被調用,它的詞法作用域都只由函數被聲明時所處的位置決定。。

    欺騙詞法作用域有兩種方法:eval(...)(非嚴格模式),with(...);

  • 誰有作用域?

  答:全局。

    函數:本質上,聲明在一個函數內部的變數或函數會在所處的作用域中“隱藏”起來,外部作用域無法訪問包裝函數內部的任何內容。

    塊作用域:指的是變數和函數不僅可以屬於所處的作用域, 也可以屬於某個代碼塊(通常指 { .. } 內部)

for (var i=0; i<10; i++) {
console.log( i );
}

上述代碼中,我們只是想定義一個在for內部使用的i變數,但事實上i變數已經污染到了整個作用域,所以從錶面上看,JS並沒有塊作用域的相關功能。但我們深入研究呢?

with:用 with 從對象中創建出的作用域僅在 with 聲明中而非外 部作用域中有效。

try/catch:catch 分句會創建一個塊作用域,其中聲明的變數僅在 catch 內部有效。

ES6:let:let 關鍵字可以將變數綁定到所在的任意作用域中(通常是 { .. } 內部)。

   但是由於 let 聲明附屬於一個新的作用域而不是當前的函數作用域(也不屬於全局作用域), 當代碼中存在對於函數作用域中 var 聲明的隱式依賴時,就會有很多隱藏的陷阱,如果用 let 來替代 var 則需要在代碼重構的過程中付出額外的精力。

    const:可以用來創建塊作用域變數,但其值是固定的 (常量)。之後任何試圖修改值的操作都會引起錯誤。

  • 為什麼要有作用域?

  答:1. 作用域的最大用處就是隔離變數,不同作用域下同名變數不會有衝突。舉個例子:XXX縣下麵有一個王家莊,一個李家莊,王家莊和胡家堡各有一個李家,兩家都有一個叫小明的兒子,胡家堡的老李家給自家小明說了個叫王小翠的媳婦。胡家堡的李小明很開心,挑了個黃道吉日準備去派處所把小翠的戶口遷到自家,試想,如果沒有王家莊和胡家堡之分,xxx縣派處所的民警就會很懵逼,兩個李小明,王小翠戶口遷誰家???有了王家莊和胡家堡的區分,這事就很好辦了。

    2.最小特權原則:在軟體設計中,應該最小限度的暴露必要內容,而將其他內容都“隱藏”起來,比如某個模塊或對象的 API 設計。

  • JS引擎進入作用域會發生什麼?

  答:JS引擎進入作用域,編譯器就會開始工作,它會執行兩輪操作(註意:進入不同的作用域都會觸發同樣的操作,這也是執行環境壓棧和出棧的由來):

  1. 初始化變數 :聲明參數並初始化,局部變數聲明,函數聲明並初始化,將這些變數保存到環境變數對象當中,

  2. 執行代碼:產生執行環境(執行環境在執行時才產生),當變數出現在賦值操作的左側時進行 LHS 查詢,出現在右側時進行 RHS 查詢。(RHS 查詢與簡單地查找某個變數的值別無二致,而 LHS 查詢則是試圖找到變數的容器本身,從而可以對其賦值。不成功的 RHS 引用會導致拋出 ReferenceError 異常。不成功的 LHS 引用會導致自動隱式地創建一個全局變數(非嚴格模式下),該變數使用 LHS 引用的目標作為標識符,或者拋 出 ReferenceError 異常(嚴格模式下)。如果 RHS 查詢找到了一個變數,但是你嘗試對這個變數的值進行不合理的操作, 比如試圖對一個非函數類型的值進行函數調用,或著引用 null 或 undefined 類型的值中的屬性,那麼引擎會拋出另外一種類型的異常,叫作 TypeError。)
  • 作用域鏈是什麼?

  答:當前作用域-->上一級作用域-->...-->全局作用域

  • 誰有作用域鏈?

  答:作用域嵌套的時候

  • 為什麼要有作用域鏈?

  答:首先需要瞭解一個概念:自由變數:在A作用域中使用的變數x,卻沒有在A作用域中聲明(即在其他作用域中聲明的),對於A作用域來說,x就是一個自由變數。

  自由變數的取值需要到創建它的作用域,正因為這樣,所以才有了作用域鏈的出現。

  書中是這樣說的:LHS 和 RHS 查詢都會在當前執行作用域中開始,如果有需要(也就是說它們沒有找到所需的標識符),就會向上級作用域繼續查找目標標識符,這樣每次上升一級作用域,最後抵達全局作用域,無論找到或沒找到都將停止。舉個例子:現實生活中我們經常看到尋人啟事(請原諒我舉這個令人悲憤的例子),尋找一個人,會在自己家找,自己家沒有,會到村,鎮,縣,市,...  由此會構成一個家-->村-->鎮-->縣-->市-->...的尋找鏈。也就是說作用域鏈的主要目的就是自由變數的取值。

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.頁面載入時向body載入文本、彈出框 <body> <script> document.write("<h1>JavaScript 會在頁面載入時向 HTML 的 <body> 寫文本</h1>"); </script> <script> alert("載入頁面彈出框"); </script>< ...
  • 在很多時候都需要用到驗證碼,前端驗證碼需要知道Html5中的canvas知識點。驗證碼生成步驟是:1.生成一張畫布canvas 2.生成隨機數驗證碼 3.在畫布中生成干擾線 4.把驗證碼文本填充到畫布中 5.點擊畫布更換驗證碼 結構與樣式: 下麵來編寫js代碼: 這樣就寫好一個較普通的驗證碼了,當然 ...
  • 原文標題:UI5 Programming Examples 本文鏈接:http://www.cnblogs.com/hhelibeb/p/6654829.html 大家好, 首先,我想對貢獻了這些例子的人們說句謝謝。 1. 表示例: 獲取選定行的值 JS Bin – Collaborative Ja ...
  • 複習CSS時發現很多選擇器不會,因為平時很少用到。現在乾脆一不做二不修,全部溫習一遍。本文參考http://css.doyoe.com/. ...
  • 總結了三種非同步請求方式,XHR、Promise和Fetch,以及兩種跨域方案JSONP和CORS。文章淺顯移動,圖片豐富。不信?你進來看啊。 ...
  • 1.onclick事件 <button type="button" onclick="alert('Welcome!')">點擊這裡</button> <div onclick="alert('Welcome!')">點擊這個div</div> 2.改變 HTML 內容 添加按鈕,並調用onclic ...
  • 今天複習css時發現::的css選擇器,查了一下,知道有偽元素和偽類這件事,他們的區別是什麼呢?很幸運已經有人總結好了!CSS3偽類和偽元素的特性和區別。前端er們大都或多或少地接觸過CSS偽類和偽元素,比如最常見的:focus,:hover以及標簽的:link、visited等,偽元素較常見的比如... ...
  • <img class="desc_img" src="https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=js&step_word=&hs=0&pn=0&spn=0&di=71153791170&pi=0&rn=1&tn... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...