javascript 詞法作用域

2021-09-14 00:01:15 字數 1139 閱讀 5743

定義在詞法階段的作用域,開始時,編譯器做語法分析的時候,確認js裡各個詞法所在的作用域。
js裡只有全域性作用域和函式作用域,這裡簡單介紹下js的作用域。

看下面**:

var a = 1;

var b = 0;

function foo()

foo();

console.log(a); //1

1、在foo函式裡,在console.log(a),對a進行rhs查詢,發現在當前作用域存在變數a,如果foo裡沒有a就往上一層(全域性)去查詢

2、在foo函式裡,在console.log(b),對b進行rhs查詢,發現在當前作用域不存在變數b,然後往上一層(全域性)去查詢b,發現存在變數b,獲取b的值。

在詞法分析階段,會確認在全域性作用域裡有a,b這兩個變數,函式foo作用域裡有a這個變數

但是,有些方法可以欺騙或者動態生成作用域。

例如:eval、settimeout、with等

eval函式可以理解為在當前作用域插入一段**。

如下:

var b = 2;

function foo()

foo();

console.log(b); //2

在開始的詞法分析中,foo函式作用域並不存在變數b,然而在引擎執行**的時候,到eval函式執行,就強行在foo函式作用域中插入變數b

settimeout

定時器函式是乙個非同步函式,第乙個引數中字串的執行作用域是全域性作用域,類似上面動態插入變數。

var b = 1;

function foo()

foo();

console.log(b); //1

with

擴充套件乙個語句的作用域鏈。

在乙個對像是擴充套件屬性,如果屬性存在就修改屬性值,如果不存在就掛載在全域性物件上,類似於在函式裡不用var宣告的變數都掛在window物件上。

詞法作用域

域表示的就是 範圍,即 作用範圍.就是乙個名字在什麼地方可以被使用,什麼時候不能使用.所謂的 詞法 作用域,就是 在編寫過程中體現出來的作用範圍.一旦寫好,不用執行,作用範圍就已經確定好了.這個就是所謂詞法作用域.這意味著函式執行在定義它的作用域中,而不是在呼叫它的作用域中。在 js 中詞法作用域規...

詞法作用域和動態作用域

作用域是指程式源 中定義變數的區域。它規定了如何查詢變數,也是就確定當前執行 對變數的訪問許可權。js 採用了詞法作用域 lexical scoping 也就是靜態作用域。js 採用的詞法作用域是靜態作用域,因此函式的作用域在函式定義的時候就決定了。與靜態作用域相對的是動態作用域,函式的作用域是在函...

詞法作用域 vs 動態作用域

scheme是一門採用詞法作用域 lexical scoping 的lisp方言,這個設計是從alogol語言裡借鑑過來的。現在,詞法作用域已經被許多lisp方言所吸收,實踐表明,這的確是一項正確的設計,避免了很多奇怪的錯誤,比較符合人類的思維習慣。但是,在某些場合下,動態作用域又是很有用的特性,比...