塊級作用域與函式作用域

2021-08-17 11:54:02 字數 1485 閱讀 5611

函式作用域:變數在定義的環境中以及巢狀的子函式中處處可見;

塊級作用域:變數在離開定義的塊級**後立即被**。

在es6之前,js的作用域只有兩種:函式作用域和全域性作用域。使用var宣告的變數,都存在變數提公升的過程。

console.

log(a)

;//undefined

console.

log(c)

;//undefined

console.

log(d)

;//function d() {}

console.

log(b)

;//報錯,b is not defined

var a =0;

let b =1;

varc

=function()

;functiond(

)

由此可見使用let宣告的變數不會提公升,函式宣告會完全提公升。上面的**等價於:

var a;

var c;

functiond(

)

console.

log(a)

; console.

log(c)

; console.

log(d)

; console.

log(b)

;

a =0;

let b =1;

c=function()

;

es6中定義了塊級作用域,使用let宣告的變數只能在塊級作用域裡訪問,有「暫時性死區」的特性(也就是說宣告前不可用)。

'use strict';

var test = 1;

function func();

func();

函式會從自身的活動物件開始,一層層向上尋找自己所需的變數,該函式在尋找test時發現,自己的作用域裡宣告了let,它就不會再往上找,而let在宣告之前是不可用的,所以就會報錯。

雖然《js高程》裡說,es6之前,js沒有塊級作用域。但我認為with語句和try-catch語句有類似於塊級作用域的地方。

var l =

;functionf(

) cosnole.

log(a)

;//1

console.

log(x)

;//報錯,x is not defined.}f

();

函式f利用with語句擴充套件了自己的作用域鏈,相當於with語句開始執行時,引數l中所包含的所有變數都被臨時加入到該函式的活動物件中,等到語句執行結束,它們就會被移除。它們只在with語句塊中有效。還有一點就是,with語句中宣告的變數a,使用var宣告的變數會自動被新增到離它最近的環境中,離a最近的環境就是函式的區域性環境,所以a就會被新增到函式的活動物件中,即使在with語句之外也能被訪問。

全域性作用域 塊級作用域

瀏覽器環境有一頂層物件window,window的屬性和var的全域性變數等價。如果用var設定了window物件的內建屬性作為變數,內建屬性值將會被覆蓋。如果是window物件的內建屬性,輸出預設值 非內建則輸出underfined。console.log window.name window.n...

全域性作用域 函式作用域 塊級作用域的理解

作用域是任何一門程式語言中的重中之重,因為它控制著變數與引數的可見性與生命週期。很慚愧,我今天才深入理解js的作用域.我不配做乙個程式設計師.開玩笑,什麼時候理解都不晚,重要的是理解了以後能不能深深地扎在記憶裡,不能,那就寫下來在乙個 塊 括在一對花括號中的一組語句 中定義的所有變數在 塊的外部是不...

塊級作用域

跨級作用域本身沒有宣告可以說的,就需要注意兩點 1.跨級作用域內宣告的var變數並不會存在這個塊級作用域內,而是會提公升到非塊級作用域內 2.在塊級作用域內宣告function,在不同瀏覽器會有不同結果,如果是根據條件宣告function的話,請用var func function的形象 但是為什麼...