JavaScript 作用域,作用域鏈詳解

2021-08-08 17:18:46 字數 1513 閱讀 3847

前言:es5缺少區域性作用域的概念,而es6已經補充了es6的概念。

一、作用域

把作用域比作乙個個封閉的方塊,在相同乙個封閉方塊中的物體可以相互接觸,但是無法和別的封閉方塊中的物體直接接觸。

二、全域性作用域

這個就是簡單的全域性作用域。全域性作用域相當於乙個最大的封閉空間,他裡面還有乙個個小的封閉空間(函式作用域),只要是定義在全域性作用域的變數和函式,彼此之間都可以互相訪問,他們同處於乙個大的封閉空間中。i1和i2可以在add()函式中呼叫,而add()函式也可以在add2()而函式中呼叫。

三、函式作用域

函式作用域就是全域性作用域中的乙個個封閉的塊,同樣在這些封閉的塊裡面,彼此之間可以相互使用,而不能供封閉的塊外面的作用域直接使用。像fn1中定義的i1,fn1中定義的add()函式,在外部無法直接使用,即在全域性作用域中無法直接使用,也不能供其他函式直接使用。(這裡無法直接使用,不包括函式傳參)。

四、區域性作用域

函式的作用域跟區域性作用域的概念有點像。但是還得說es5中沒有區域性作用域。看看下面兩個例子。

這時候會發現,定義在if裡面跟定義在for裡面的變數,在全域性作用域中都可以使用。失去了作用域的作用了。

不過在es5中除了函式作用域外還是有其他作用域效果的。

輸出結果顯示,全域性作用域不能訪問到i,有一定的作用域的效果。

es6補充區域性作用域

es6中補充了區域性作用域概念,要通過let來定義變數。

for(let i = 0; i<10; i++)

console.log(i);

同樣的**,通過let定義變數。會發現我們在全域性作用域已經無法訪問到定義在if裡面跟定義在for裡面的變數。突出了區域性作用域。

五、作用域鏈

作用域鏈:當**在乙個環境中執行時,會建立變數物件的乙個作用域鏈。作用域鏈的用途,是保證對執行環境有權訪問的所有變數和函式的有序訪問。(作用域鏈的前端,始終都是當前執行的**所在環境的活動物件)

輸出的都是 x ,卻得到三個完全不一樣的值。

來想象下他們的作用域鏈 :

1、add2 函式作用域--作用域鏈: add2定義的x——》add1定義的x——》

全域性定義的x

2、add1 函式作用域

--作用域鏈: add1定義的x——》全域性定義的x

3、全域性作用域--作用域鏈:全域性定義的x

add2執行的時候,如果在add2函式作用域沒找到變數

x,它會往上一級add1中找變數

x;如果在add1函式區域性執行環境中沒找到變數

x ,他會往全域性作用域中找。例子中,函式add2在自己的函式作用域中找到了變數物件 x ,就不再繼續往上找,而是輸出自己他這一級的 x 。(函式引數也被當作變數來對待)

Javascript的作用域域作用域鏈的理解

如何解析一段可執行 分了兩個階段 解析 和執行 其中解析 可以理解為記名字,就是先把關鍵字var和function定義的變數名登記了下來,這也就有了變數提公升這一說。在執行 階段才是真正的執行賦值,運算等操作。暫不解析這幾個名詞,先來看乙個例子。var scope global function f...

Javascript變數作用域

1.變數作用域是什麼鬼?2.全域性變數 全域性變數擁有全域性作用域 作用範圍在整個頁面中 在 的任何地方都有定義。擁有全域性作用域的情形 1 宣告在函式外部的變數。eg var a 全域性變數 function b 2 宣告變數時,缺少關鍵字var。eg function b 函式引數的變數 fun...

javascript作用域鏈

首先我們來看一段 然後通過分析這段 來說明作用域鏈的這個問題,如下 console.log total var total 0 function fn num1,num2 fn 100,200 console.log total 複製 這段 輸出的結果為 undefined undefined 30...