this/閉包/作⽤域
專業術語
執行上下文
當函式執行時,會建立乙個稱為執行上下文(execution context)的環境,分為建立和執行兩個階段
建立階段
建立階段,指函式呼叫但未執行任何**時,此時建立了乙個擁有三個屬性的物件:
executioncontext =
,// 建立作用域鏈(scope chain)
variableobject:
,// 初始化變數、函式、形參
this
:// 指定this
}
**執行階段
**執行階段主要的工作是:1、分配變數、函式的引用,賦值。2、執行**。
// 執行這段**
function
demo
(num)
;functiona(
)}demo
(500);
// 建立階段,在這個階段就出現了變數提公升(hoisting)
executioncontext =
,// 作用域鏈是乙個引用陣列
variableobject:
, num:
500,
// 建立形參名稱,賦值/或建立引用拷貝
a: pointer to functiona(
),// 有內部宣告的話,建立引用指向函式體
name: undefined,
// 有內部宣告變數a,初始化為undefined
fn: undefined // 有內部宣告變數fn,初始化為undefined},
this:}
// **執行階段,在這個階段主要是賦值並執行**
executioncontext =
, variableobject:
, num:
500,
a: pointer to functiona(
),name:
'jinxing'
,// 分配變數,賦值
fn: pointer to functionfn(
)// 分配函式的引用,賦值},
this
:}
執行上下文棧
作用域鏈
作用域鏈是乙個引用陣列,當乙個塊或函式巢狀在另乙個塊或函式中時,就發生了作用域的巢狀。在當前函式中如果js引擎無法找到某個變數,就會往上一級巢狀的作用域中去尋找,知道找到該變數或抵達全域性作用域,這樣的鏈式關係就稱為作用域鏈(scope chain)。js 是基於詞法作用域的,是靜態分析的,並不是執行的時候向上找,而是定義的時候向上找。
閉包閉包是指有權訪問另個乙個函式作用域中變數的函式。
// 舉例:
function
create()
}var b =
create()
b()// create函式執行,建立了自己的執行上下文環境和作用域鏈,create的作用域鏈陣列中,0號位放的是create函式自己的活動變數(物件)的引用,1號位放的是全域性變數物件(window)的引用。
// 當create函式執行完畢,返回乙個新的匿名函式賦值給b,此時create函式的執行上下文環境的作用域鏈會被銷毀,但是b函式的作用域鏈中還存在對create函式活動變數(變數)的引用,所以記憶體中的不會被銷毀。
// b函式執行,建立自己的執行上下文環境及相應的作用域鏈,b函式作用域鏈的0號位是自己的活動變數(物件)的引用,1號位是create函式的活動變數(物件)的引用,2號位放的是全域性變數物件(window)的引用。
// b函式執行完畢,銷毀b函式的執行上下文環境和作用域鏈。
this
誰用點操作符呼叫函式,函式內的this就指向誰。
// 例 1: 函式直接調⽤時
function
myfunc()
myfunc()
// 例 2:函式被別⼈調⽤時
function
myfunc()
var a =
a.myfunc()
// 例 3:new⼀個例項時
function
person
(name)
var p =
newperson
('jinxing');
function
getcolor
(color)
function
car(name, color)
var car =
newcar
('卡⻋'
,'綠⾊');
// 例 5:有箭頭函式時
var a =,0
)}};
a.myfunc()
;
深度剖析變數作 域與閉包
變數分為區域性變數和全域性變數 區域性變數 只在定義的函式內部使 全域性變數 可以在整個script作 域內都可以使 作 域鏈,只有在 當前的 作 域內找不到才會向 級作 域 尋找,直到找不到為 存在同名變數時,在當前作 域內區域性變數 會覆蓋全域性變數,區域性變數優先順序 較 閉包簡單理解 可以調...
作用域 閉包
1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...
作用域與閉包
執行上下文 範圍 一段或者乙個函式 全域性 變數定義 函式宣告 一段 函式 變數定義 函式宣告 this arguments 函式 ps 注意 函式宣告 和 函式表示式 的區別 console.log a var a 100 fn zhangsan function fn name this thi...