日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解js系列一作用域是什么

發布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解js系列一作用域是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

title: 深入理解js系列一作用域是什么? date: 2018-02-06 02:15:59 tags:

  • 深入理解js系列
  • 作用域 categories: JavaScript

作用域是什么?

變量的作用域到底是如何在js中工作的?

js是解釋型語言而無法編譯嗎?

什么是詞法作用域?

RHS查詢與LHS查詢?

理解作用域

js中的作用域可以理解為一套定義的規則,用來管理js引擎根據標識符名稱進行變量查找,并確定當前執行代碼對這些變量的訪問權限。

編譯原理

要想深入理解js的作用域,我們必須得先知道js事實上是一門編譯型語言(動態編譯)-- js引擎實際上是動態編譯程序然后立即執行。與傳統編譯語言在構建前編譯不同的是:js的編譯發生在代碼執行前(有時是執行中)的很短時間內,而且編譯完通常就會馬上執行它。另外,對比傳統編譯,js引擎在語法分析和代碼生成階段有特定的步驟對運行性能進行優化。這也是后面會談到的eval()和with() 影響運行效率的原因。

編譯的三個步驟

我們先來看看在傳統編譯語言中,一段源程序在執行前通常要經歷的三個步驟,js作為一門動態編譯語言,同樣也會經歷這些步驟:

  • 分詞/詞法分析(將源代碼分解成詞法單元)
  • 解析/語法解析(轉換為一棵由元素逐級嵌套組成代表程序語法的抽象語法樹AST)
  • 代碼生成(將AST轉換為可執行代碼)
  • 在js中,js引擎負責整個js程序的編譯和執行過程,編譯器負責語法分析以及代碼生成。

    js引擎做了什么?

    當遇到var a = 2這段程序,js引擎做了什么?

  • 首先編譯器會將這段代碼分解成詞法單元
  • 編譯器再將詞法單元解析成一個樹結構
  • 編譯器開始進行代碼生成
  • 遇到var a,查詢作用域鏈是否有變量a: 。 有a:跳過繼續編譯 。 無a:在當前作用域聲明一個變量a
  • 為引擎生成運行時所需代碼
  • 引擎查詢作用域鏈是否存在變量a: 。存在:使用變量a執行賦值操作 。不存在:拋出一個異常
  • 可以看出,變量的賦值操作會執行兩個動作:
    一個由編譯器在編譯時處理,另一個由引擎在運行時處理。

    RHS查詢與LHS查詢?

    LHS查詢:查找變量的容器本身(a=1) RHS查詢: 查找變量的值(console.log(a))

    function foo(a){console.log(a) } foo(2) //RHS查詢 // 將2作為參數傳給foo函數,給參數a隱式地分配值時進行了一次LHS查詢 復制代碼

    作用域嵌套

    異常

    在作用域中找不到變量

    在作用域中找變量

    總結:
    不成功的RHS引用拋ReferenceError

    總結

    以上是生活随笔為你收集整理的深入理解js系列一作用域是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。