1. 程式人生 > >js 原型鏈 及 作用域鏈 及 this指向問題 白話理解

js 原型鏈 及 作用域鏈 及 this指向問題 白話理解

一段拗口的話,理解一下:當代碼在一個環境中執行時,會建立變數物件的一個作用域鏈。作用域鏈的用途是保證對執行環境有權訪問的所有變數和函式的有序訪問

作用域:一個變數的作用域(scope)是程式原始碼中定義的這個變數的區域。(注意變數的作用域是定義這個變數時決定的,而非再執行某個方法時決定)

es5 有兩種作用域,函式作用域及全域性作用域

每一段js程式碼(全域性程式碼或函式)都有一個與之關聯的作用域鏈(scope chain)。

這個作用域鏈是一個物件列表或者連結串列,這組物件定義了這段程式碼中“作用域中”的變數。

當js需要查詢變數x的值的時候(這個過程稱為變數解析(variable resolution)),它會從鏈的第一個物件開始查詢,如果這個物件有一個名為x的屬性,則會直接使用這個屬性的值,如果第一個物件中沒有名為x的屬性,js會繼續查詢鏈上的下一個物件。如果第二個物件依然沒有名為x的屬性,則會繼續查詢下一個,以此類推。如果作用域鏈上沒有任何一個物件含有屬性x,那麼就認為這段程式碼的作用域鏈上不存在x,並最終丟擲一個引用錯誤(ReferenceError)異常。

總結:作用域鏈的作用是對於變數來說可以按照這個鏈去找到值,只能向上查詢,找到了第一個就不再查詢,這個作用域及作用域鏈都是當這個變數被定義的時候就決定了,和執行順序無關。

一些問題:

這段程式碼執行結果是3,因為函式c在定義時它就構成了一個作用域,它的上一個作用域是全域性,並非那個自執行函式(

作用域及作用域鏈都是當這個變數被定義的時候就決定了,和執行順序無關。

這道題之所以可以在for語句外面打印出i是因為js語句沒有構成一個作用域,它的作用域依然屬於全域性,把var 改成let會報錯,試試

這道題比較綜合,仔細理解了很多遍才理解,挺值得研究的,先不寫解釋。。思考。。。

這道題需要對原型鏈比較瞭解  執行結果是