通常而言,在Javascript中,this指向函數執行時的當前對象。如a.b()的a,而b()通常指向window。javascript
訪問變量則向上訪問執行環境,執行環境包括函數環境和全局環境。前端
一。對象內this探索java
(1)瀏覽器
var c = 6; var a = { c:5, b:function(){return this.c} } console.log(a.b())//5
這個this指的是a的context閉包
(1)去掉a.c後,返回undefined函數
var c = 6; var a = { b:function(){return this.c} } console.log(a.b())//undefined
這個this指的是a的contextthis
(1)若改變當前對象spa
var c = 6; var a = { b:function(){return this.c} } var d = a.b console.log(d())//6
(1)去掉this,返回window.c,此時執行環境棧,[0]是window,[1]是b function()設計
var c = 6; var a = { c:5, b:function(){return c} } console.log(a.b())//6
二。閉包內thiscode
(2)
var c = 6; var a = (function(){ var c = 5; var b = function(){return c}; return {B:b} })() console.log(a.B())//5
共有方法B訪問匿名函數環境下的c
(2)去掉a.c,返回6
var c = 6; var a = (function(){ var b = function(){return c}; return {b:b} })() console.log(a.b())//6
(2)c改成this.c,返回undefined
var c = 6; var a = (function(){ var c = 5; var b = function(){return this.c}; return {b:b} })()
console.log(a.b())//undefined
這個this指的是a的公有context,即{b:b}
(2)c改成this.c,return 加上c:c,返回5
var c = 6; var a = (function(){ var c = 5; var b = function(){return this.c}; return {b:b,c:c} })() console.log(a.b())//5
這個this指向{b:b,c:c}context
另外一個例子
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); //"The Window"
匿名函數處於window環境下,所以this指向window
在閉包中使用 this 對象也可能會致使一些問題。咱們知道, this 對象是在運行時基於函數的執
行環境綁定的:在全局函數中, this 等於 window,而當函數被做爲某個對象的方法調用時, this 等
於那個對象。不過,匿名函數的執行環境具備全局性,所以其 this 對象一般指向 window。但有時候
因爲編寫閉包的方式不一樣,這一點可能不會那麼明顯。每一個函數在被調用時都會自動取得兩個特殊變量:
this 和 arguments。內部函數在搜索這兩個變量時,只會搜索到其活動對象爲止,所以永遠不可能直接
訪問外部函數中的這兩個變量。
執行環境及做用域(出自javascript高級程序設計)
執行環境(execution context,爲簡單起見,有時也稱爲「 環境」)是 JavaScript 中最爲重要的一個概念。執行環境定義了變量或函數有權訪問的其餘數據,決定了它們各自的行爲。每一個執行環境都有一個與之關聯的變量對象(variable object) ,環境中定義的全部變量和函數都保存在這個對象中。雖然咱們編寫的代碼沒法訪問這個對象,但解析器在處理數據時會在後臺使用它。全局執行環境是最外圍的一個執行環境。根據 ECMAScript 實現所在的宿主環境不一樣,表示執行環境的對象也不同。在 Web 瀏覽器中,全局執行環境被認爲是 window 對象(第 7 章將詳細討論) ,因此全部全局變量和函數都是做爲 window 對象的屬性和方法建立的。某個執行環境中的全部代碼執行完畢後,該環境被銷燬,保存在其中的全部變量和函數定義也隨之銷燬(全局執行環境直到應用程序退出——例如關閉網頁或瀏覽器——時纔會被銷燬)。每一個函數都有本身的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。而在函數執行以後,棧將其環境彈出,把控制權返回給以前的執行環境。 ECMAScript 程序中的執行流正是由這個方便的機制控制着。當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈(scope chain)。做用域鏈的用途,是保證對執行環境有權訪問的全部變量和函數的有序訪問。做用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。若是這個環境是函數,則將其活動對象(activation object)做爲變量對象。活動對象在最開始時只包含一個變量,即 arguments 對象(這個對象在全局環境中是不存在的)。做用域鏈中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是做用域鏈中的最後一個對象。標識符解析是沿着做用域鏈一級一級地搜索標識符的過程。搜索過程始終從做用域鏈的前端開始,而後逐級地向後回溯,直至找到標識符爲止(若是找不到標識符,一般會致使錯誤發生)。