javascript中this實例及理解


通常而言,在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 對象(這個對象在全局環境中是不存在的)。做用域鏈中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是做用域鏈中的最後一個對象。標識符解析是沿着做用域鏈一級一級地搜索標識符的過程。搜索過程始終從做用域鏈的前端開始,而後逐級地向後回溯,直至找到標識符爲止(若是找不到標識符,一般會致使錯誤發生)。

相關文章
相關標籤/搜索