国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

this 的工作原理

Salamander / 383人閱讀

摘要:的工作原理有一套完全不同于其它語言的對的處理機制。全局范圍內(nèi)當(dāng)在全部范圍內(nèi)使用,它將會指向全局對象。因此中的不會指向,因為只可能出現(xiàn)在上述的五種情況中。雖然的晚綁定特性似乎并不友好,但是這確實基于原型繼承賴以生存的土壤。

this 的工作原理

JavaScript 有一套完全不同于其它語言的對 this 的處理機制。
種不同的情況下 ,this 指向的各不相同。

全局范圍內(nèi)
this;

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

  

譯者注:瀏覽器中運行的 JavaScript 腳本,這個全局對象是 window

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

這里 this 也會指向全局對象。

  

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

方法調(diào)用
test.foo(); 

這個例子中,this 指向 test 對象。

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

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

顯式的設(shè)置 this
function foo(a, b, c) {}

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

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

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

  

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

常見誤解

盡管大部分的情況都說的過去,不過第一個規(guī)則(譯者注:這里指的應(yīng)該是第二個規(guī)則,也就是直接調(diào)用函數(shù)時,this 指向全局對象)
被認為是JavaScript語言另一個錯誤設(shè)計的地方,因為它從來就沒有實際的用途。

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

一個常見的誤解是 test 中的 this 將會指向 Foo 對象,實際上不是這樣子的。

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

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

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

方法的賦值表達式

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

var test = someObject.methodTest;
test();

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

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

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

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

new Bar().method();

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

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85348.html

相關(guān)文章

  • 深入淺出,JS原型鏈工作原理

    摘要:前言原型鏈,即原型鏈條。原型的作用在中,每個對象都有自己的原型。訪問的屬性方法依舊不存在于該原型,則會繼續(xù)訪問該原型的原型 前言:原型鏈,即原型鏈條。它是由原型、原型的原型、原型的原型的原型...這一規(guī)則組合成的,經(jīng)常被應(yīng)用于繼承。 原型的作用在JS中,每個對象都有自己的原型。當(dāng)我們訪問對象的屬性和方法時,JS會先訪問對象本身的屬性和方法。如果對象本身不包含這些屬性和方法,則訪問對象...

    Ali_ 評論0 收藏0
  • JavaScript是如何工作:深入類和繼承內(nèi)部原理+Babel和 TypeScript 之間轉(zhuǎn)換

    摘要:下面是用實現(xiàn)轉(zhuǎn)成抽象語法樹如下還支持繼承以下是轉(zhuǎn)換結(jié)果最終的結(jié)果還是代碼,其中包含庫中的一些函數(shù)。可以使用新的易于使用的類定義,但是它仍然會創(chuàng)建構(gòu)造函數(shù)和分配原型。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 15 篇。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯過了前面的章節(jié),可以在這里找到它們: JavaScript 是...

    PrototypeZ 評論0 收藏0
  • 【譯】this 是什么?JavaScript 對象內(nèi)部工作原理

    摘要:關(guān)鍵字會實例化一個新的對象實例,并在執(zhí)行構(gòu)造函數(shù)時將指向該實例。原文鏈接譯是什么對象的內(nèi)部工作原理 原文鏈接:What is this? The Inner Workings of JavaScript Objects (需要梯子) 原文作者:Eric Elliott 譯文永久鏈接:【譯】什么是 this?JavaScript 對象的內(nèi)部工作原理 譯者:士心 翻譯目的:函數(shù)動...

    Hwg 評論0 收藏0
  • 原理剖析(第 003 篇)ThreadPoolExecutor工作原理分析

    摘要:原理剖析第篇工作原理分析一大致介紹相信大家都用過線程池,對該類應(yīng)該一點都不陌生了我們之所以要用到線程池,線程池主要用來解決線程生命周期開銷問題和資源不足問題我們通過對多個任務(wù)重用線程以及控制線程池的數(shù)目可以有效防止資源不足的情況本章節(jié)就著 原理剖析(第 003 篇)ThreadPoolExecutor工作原理分析 - 一、大致介紹 1、相信大家都用過線程池,對該類ThreadPoolE...

    CatalpaFlat 評論0 收藏0
  • 原理剖析(第 010 篇)Netty之服務(wù)端啟動工作原理分析(上)

    摘要:端引導(dǎo)類線程管理組線程管理組將設(shè)置到服務(wù)端引導(dǎo)類中指定通道類型為,一種異步模式,阻塞模式為設(shè)置讓服務(wù)器監(jiān)聽某個端口已等待客戶端連接。 原理剖析(第 010 篇)Netty之服務(wù)端啟動工作原理分析(上) - 一、大致介紹 1、Netty這個詞,對于熟悉并發(fā)的童鞋一點都不陌生,它是一個異步事件驅(qū)動型的網(wǎng)絡(luò)通信框架; 2、使用Netty不需要我們關(guān)注過多NIO的API操作,簡簡單單的使用即可...

    coordinate35 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<