成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

細(xì)說(shuō) Javascript 函數(shù)篇(二) : this 的工作機(jī)制

ZoomQuiet / 2464人閱讀

摘要:與其他編程語(yǔ)言相比,對(duì)的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對(duì)象。此時(shí)在函數(shù)內(nèi),指向新建的對(duì)象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。

與其他編程語(yǔ)言相比,Javascript 對(duì) this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。

全局作用域下
this;

當(dāng)在全局作用域中使用 this,它指向全局對(duì)象。
這里詳細(xì)介紹下全局對(duì)象:

  

全局對(duì)象(Global object) 是在進(jìn)入任何執(zhí)行上下文之前就已經(jīng)創(chuàng)建了的對(duì)象;
這個(gè)對(duì)象只存在一份,它的屬性在程序中任何地方都可以訪問(wèn),全局對(duì)象的生命周期終止于程序退出那一刻。
全局對(duì)象初始創(chuàng)建階段將 Math、String、Date、parseInt 作為自身屬性,等屬性初始化,同樣也可以有額外創(chuàng)建的其它對(duì)象作為屬性(其可以指向到全局對(duì)象自身)。例如,在 DOM 中,全局對(duì)象的 window 屬性就可以引用全局對(duì)象自身。
所以在 console 內(nèi)輸入 windowthis.window 是一樣的。

調(diào)用一個(gè)函數(shù)時(shí)
foo();

在這里,this 同樣指向全局對(duì)象。

調(diào)用一個(gè)方法時(shí)
test.foo(); 

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

調(diào)用一個(gè)構(gòu)造函數(shù)時(shí)
new foo();

一個(gè)函數(shù)在被調(diào)用時(shí)和關(guān)鍵字 new 一起使用,我們稱(chēng)之為構(gòu)造函數(shù)。此時(shí)在函數(shù)內(nèi),this 指向新建的對(duì)象。

顯式設(shè)置時(shí)
function foo(a, b, c) {}//

var bar = {};
foo.apply(bar, [1, 2, 3]); // array will expand to the below
foo.call(bar, 1, 2, 3); // results in a = 1, b = 2, c = 3

當(dāng)使用 Function.prototypeapplycall 方法時(shí),this 的值為顯式設(shè)置為該方法的第一個(gè)參數(shù)。
因此,不同于調(diào)用一個(gè)函數(shù)時(shí)的規(guī)則,上例中 this 指向了 bar。
這里介紹下 callapply 方法:

  

call 方法:
語(yǔ)法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。

  

apply 方法:
語(yǔ)法:apply([thisObj[,argArray]])
定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。

在這里我們要注意一點(diǎn),在對(duì)象的字面聲明時(shí),this 不能用來(lái)指向?qū)ο蟊旧?。如下?/p>

var obj = {me: this}

這里,this 不會(huì)指向 objthis 的應(yīng)用只限于以上五種情形。

總結(jié)

盡管上述情形在大多時(shí)候是有意義的,但是第二種情形(即調(diào)用一個(gè)函數(shù)時(shí))的 this 實(shí)際上是很少有用途的,這被認(rèn)為是 Javascript 設(shè)計(jì)上的另一個(gè)錯(cuò)誤。

Foo.method = function() {
    function test() {
        // this is set to the global object
    }
    test();
}

根據(jù)我們上面所述,這里的 this 將會(huì)指向全局對(duì)象,而不是 Foo 函數(shù)。
為了在 test 中獲得指向 Foo 的途徑,我們需要在 method 內(nèi)部創(chuàng)建一個(gè)局部變量指向 Foo。

Foo.method = function() {
    var that = this;
    function test() {
        // Use that instead of this here
    }
    test();
}

that 只是普通的變量名,但是它經(jīng)常被用來(lái)指向外部的 this。
還有一個(gè)比較有意思的地方與函數(shù)別名相關(guān),即將一個(gè)方法賦值給一個(gè)變量時(shí)。

var test = someObject.methodTest;
test();

上例中,test 將會(huì)被當(dāng)做一個(gè)普通函數(shù)看待,所以根據(jù)第二種情形(即調(diào)用一個(gè)函數(shù)時(shí)),其內(nèi)部的 this 將會(huì)指向全局變量,而不是 someObject。
盡管,this 晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。

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

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

new Bar().method();

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

參考

http://bonsaiden.github.io/JavaScript-Garden/#function.this

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87519.html

相關(guān)文章

  • 細(xì)說(shuō) Javascript 函數(shù)(一) : 函數(shù)聲明和函數(shù)表達(dá)式

    摘要:函數(shù)表達(dá)式對(duì)于函數(shù)聲明,函數(shù)的名稱(chēng)是必須的,而對(duì)于函數(shù)表達(dá)式而言則是可選的,因此,就出現(xiàn)了匿名函數(shù)表達(dá)式和命名函數(shù)表達(dá)式。這是因?yàn)閷?duì)命名函數(shù)處理的機(jī)制,函數(shù)的名稱(chēng)永遠(yuǎn)在函數(shù)內(nèi)部的作用域中有效。 function 是 Javascript 中的第一類(lèi)對(duì)象,這就意味著函數(shù)可以像其他值一樣被傳遞。一個(gè)最常見(jiàn)的用法就是將一個(gè)匿名函數(shù)作為回調(diào)函數(shù)傳遞到另外一個(gè)異步函數(shù)中。 函數(shù)聲明 func...

    hizengzeng 評(píng)論0 收藏0
  • 細(xì)說(shuō) Javascript 函數(shù)(五) : ?構(gòu)造函數(shù)

    Javascript 中的構(gòu)造函數(shù)與其他語(yǔ)言相比也是不同的。任何通過(guò)關(guān)鍵字 new 調(diào)用的函數(shù)都可以當(dāng)做構(gòu)造函數(shù)。 在構(gòu)造函數(shù)體內(nèi),this 指向新創(chuàng)建的對(duì)象。如果構(gòu)造函數(shù)體內(nèi)沒(méi)有顯示的 return 表達(dá)式,那么我們就默認(rèn)返回 this,也就是新建的對(duì)象。 function Foo() { this.bla = 1; } Foo.prototype.test = function()...

    sPeng 評(píng)論0 收藏0
  • 細(xì)說(shuō) Javascript 對(duì)象) : 原型對(duì)象

    摘要:并沒(méi)有類(lèi)繼承模型,而是使用原型對(duì)象進(jìn)行原型式繼承。我們舉例說(shuō)明原型鏈查找機(jī)制當(dāng)訪問(wèn)一個(gè)對(duì)象的屬性時(shí),會(huì)從對(duì)象本身開(kāi)始往上遍歷整個(gè)原型鏈,直到找到對(duì)應(yīng)屬性為止。原始類(lèi)型有以下五種型。此外,試圖查找一個(gè)不存在屬性時(shí)將會(huì)遍歷整個(gè)原型鏈。 Javascript 并沒(méi)有類(lèi)繼承模型,而是使用原型對(duì)象 prototype 進(jìn)行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然...

    lansheng228 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<