在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ this 的工作原理
arguments 對(duì)象
類型轉(zhuǎn)換
構(gòu)造函數(shù)
instanceof 操作符
自動(dòng)分號(hào)插入
為什么不要使用 eval
對(duì)象使用和屬性
作用域與命名空間
this 的工作原理
typeof 操作符
相等與比較
閉包和引用
數(shù)組遍歷與屬性
Array 構(gòu)造函數(shù)
原型
hasOwnProperty 函數(shù)
undefined 和 null
函數(shù)聲明與表達(dá)式
setTimeout 和 setInterval
for in 循環(huán)

this 的工作原理

JavaScript 有一套完全不同于其它語(yǔ)言的對(duì) this 的處理機(jī)制。 在種不同的情況下 ,this 指向的各不相同。

全局范圍內(nèi)

    this;

當(dāng)在全部范圍內(nèi)使用 this,它將會(huì)指向全局對(duì)象。

譯者注瀏覽器中運(yùn)行的 JavaScript 腳本,這個(gè)全局對(duì)象是 window。

函數(shù)調(diào)用

    foo();

這里 this 也會(huì)指向全局對(duì)象。

ES5 注意: 在嚴(yán)格模式下(strict mode),不存在全局變量。 這種情況下 this 將會(huì)是 undefined。

方法調(diào)用

    test.foo(); 

這個(gè)例子中,this 指向 test 對(duì)象。

調(diào)用構(gòu)造函數(shù)

    new foo(); 

如果函數(shù)傾向于和 new 關(guān)鍵詞一塊使用,則我們稱這個(gè)函數(shù)是 構(gòu)造函數(shù)。 在函數(shù)內(nèi)部,this 指向新創(chuàng)建的對(duì)象。

顯式的設(shè)置 this

    function foo(a, b, c) {}

    var bar = {};
    foo.apply(bar, [1, 2, 3]); // 數(shù)組將會(huì)被擴(kuò)展,如下所示
    foo.call(bar, 1, 2, 3); // 傳遞到foo的參數(shù)是:a = 1, b = 2, c = 3

當(dāng)使用 Function.prototype 上的 call 或者 apply 方法時(shí),函數(shù)內(nèi)的 this 將會(huì)被 顯式設(shè)置為函數(shù)調(diào)用的第一個(gè)參數(shù)。

因此函數(shù)調(diào)用的規(guī)則在上例中已經(jīng)不適用了,在foo 函數(shù)內(nèi) this 被設(shè)置成了 bar

注意: 在對(duì)象的字面聲明語(yǔ)法中,this 不能用來(lái)指向?qū)ο蟊旧怼?因此 var obj = {me: this} 中的 me 不會(huì)指向 obj,因?yàn)?this 只可能出現(xiàn)在上述的五種情況中。 譯者注這個(gè)例子中,如果是在瀏覽器中運(yùn)行,obj.me 等于 window 對(duì)象。

常見(jiàn)誤解

盡管大部分的情況都說(shuō)的過(guò)去,不過(guò)第一個(gè)規(guī)則(譯者注這里指的應(yīng)該是第二個(gè)規(guī)則,也就是直接調(diào)用函數(shù)時(shí),this 指向全局對(duì)象) 被認(rèn)為是JavaScript語(yǔ)言另一個(gè)錯(cuò)誤設(shè)計(jì)的地方,因?yàn)樗?strong>從來(lái)就沒(méi)有實(shí)際的用途。

    Foo.method = function() {
        function test() {
            // this 將會(huì)被設(shè)置為全局對(duì)象(譯者注:瀏覽器環(huán)境中也就是 window 對(duì)象)
        }
        test();
    }

一個(gè)常見(jiàn)的誤解是 test 中的 this 將會(huì)指向 Foo 對(duì)象,實(shí)際上不是這樣子的。

為了在 test 中獲取對(duì) Foo 對(duì)象的引用,我們需要在 method 函數(shù)內(nèi)部創(chuàng)建一個(gè)局部變量指向 Foo 對(duì)象。

    Foo.method = function() {
        var that = this;
        function test() {
            // 使用 that 來(lái)指向 Foo 對(duì)象
        }
        test();
    }

that 只是我們隨意起的名字,不過(guò)這個(gè)名字被廣泛的用來(lái)指向外部的 this 對(duì)象。 在 閉包 一節(jié),我們可以看到 that 可以作為參數(shù)傳遞。

方法的賦值表達(dá)式

另一個(gè)看起來(lái)奇怪的地方是函數(shù)別名,也就是將一個(gè)方法賦值給一個(gè)變量。

    var test = someObject.methodTest;
    test();

上例中,test 就像一個(gè)普通的函數(shù)被調(diào)用;因此,函數(shù)內(nèi)的 this 將不再被指向到 someObject 對(duì)象。

雖然 this 的晚綁定特性似乎并不友好,但這確實(shí)是基于原型繼承賴以生存的土壤。

    function Foo() {}
    Foo.prototype.method = function() {};

    function Bar() {}
    Bar.prototype = Foo.prototype;

    new Bar().method();

當(dāng) method 被調(diào)用時(shí),this 將會(huì)指向 Bar 的實(shí)例對(duì)象。