this 閉包 作 域

2021-10-05 19:31:25 字數 2416 閱讀 8220

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...