函式作用域:變數在定義的環境中以及巢狀的子函式中處處可見;
塊級作用域:變數在離開定義的塊級**後立即被**。
在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的形象 但是為什麼...