理解作用域(引擎,編譯器,作用域)

来源:http://www.cnblogs.com/Darlietoothpaste/archive/2017/01/23/6344126.html
-Advertisement-
Play Games

在JS中,引擎,編譯器,作用域分別扮演以下角色: 引擎:負責整個Js程式的編譯以及執行過程。 編譯器:負責語法分析以及代碼生成等。 作用域:負責收集並維護所有聲明的標示符(變數)組成的一系列查詢,並實施一套嚴格的規則,確定當前執行的代碼對這些標識符的訪問許可權。 下麵用一個小例子來表示: var a ...


  在JS中,引擎,編譯器,作用域分別扮演以下角色:

      引擎:負責整個Js程式的編譯以及執行過程。

      編譯器:負責語法分析以及代碼生成等。

      作用域:負責收集並維護所有聲明的標示符(變數)組成的一系列查詢,並實施一套嚴格的規則,確定當前執行的代碼對這些標識符的訪問許可權。

  

 下麵用一個小例子來表示:

      var a = 2;

      1.首先,遇到var a,編譯器會詢問當前作用域是否有一個該變數存在,如果存在,編譯器則會忽略進行下一步,否則編譯器會要求作用域在當前聲明一個新的變數,並命名為a。

      2.接下來編譯器會為引擎生成運行時所需要的代碼,這些代碼被用來處理 a = 2這個賦值操作,引擎運行時首先詢問作用域,是否存在變數a,若存在,引擎就會直接使用該變數,否則引擎會繼續向上一個作用域尋找,直到找到為止,如果在全局作用域還未找到,此時引擎會拋出一個異常。

  

 關於引擎查詢:

       引擎查詢有兩種查詢方式,分別為LHS(左查詢)和RHS(非左查詢)

       LHS查詢是找到該變數的容器,如var a = 2; 在查詢a時就需用到LHS查詢。

       RHS查詢可以理解為找到該變數的值,如 a = b ,在查詢b時,僅需要得到它的值,並不關心他本身容器,故使用RHS查詢。

 一個小例子便於理解:

       function foo(a){

          var a = b;

          return a+b;

       }

       var c = foo(2);

其中使用了三次LHS,分別為 var c,var a,以及foo(2)的時候把2賦值給a(隱式賦值);

      使用了四次RHS,分別為foo(2), = b, return a + b(a,b)各一次。 

   

  關於為什麼要區分LHSRHS是很重要呢?

  因為異常

  在變數還未聲明的情況下(即在任何作用域都找不到該變數),這兩種查詢的方式是不同的。

  LHS

       LHS在非嚴格模式下,找不到該變數時,它會直接聲明一個該變數,如a = b,中的a會被聲明。但如果在嚴格模式下,則會拋出一個ReferenceError.

  RHS:

       RHS找不到時會直接拋出一個ReferenceError.

       ReferenceError是同作用域判定失敗有關,而TypeError則是代表作用域判別成功,但是對結果的操作屬於非法,比如試圖對一個非函數的值進行函數調用。

  


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

-Advertisement-
Play Games
更多相關文章
  • A jQuery tabs module for todays web! 實例DEMO 運行一下 Documentation Tabulous.js can be used with any contents you choose in the tabs and it couldn't be mor ...
  • html css css3 javascript html5 jQuery jQuery UI jQuery EasyUI Exits Highcarts Chart Two Jsp Asp.net PHP Python MySql SQL Server Oracle MongDB XML JONG ...
  • 下麵這個是結合css+html5+javascript的一個更複雜的圓環圖形 原文鏈接:HTML5 CSS3如何繪製任意角度的扇形 ...
  • ▓▓▓▓▓▓ 大致介紹 Git是一款免費、開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目,可以有效、高速的處理從很小到非常大的項目版本管理。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體 ▓▓▓▓▓▓ Git的誕生 G ...
  • [1]刷新 [2]搜索 [3]計算樣式 [4]資源映射 [5]當前位置 ...
  • 層次選擇器: $("div li")獲取div下的所有li元素(後代、子、子的子......) $("div>li")獲取div下的直接li子元素。 $(".menuitem+div")獲取樣式名為menuitem之後的第一個div元素(不常用)。 $(".menuitem~div")獲取樣式名為m ...
  • yield next和yield* next之間到底有什麼區別?為什麼需要yield* next?經常會有人提出這個問題。雖然我們在代碼中會儘量避免使用yield* next以減少新用戶的疑惑,但還是經常會有人問到這個問題。為了體現自由,我們在koa框架內部使用了yield* next,但是為了避免 ...
  • 2017年也已經開始了快一個月的時間了,然而我卻好像沒有跨進新一年的感覺 過去的一年裡,前端開發這個行業的變化給我的感覺實在是快得有點眼花繚亂應接不暇 各種工程化工具,各種新框架占據了這個行業裡人們日常討論的話題 然而反思回自己的團隊,仍然是停留在比較基礎的開發流程。不得不讓我恍然醒悟,自己真是半年 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...