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

資訊專欄INFORMATION COLUMN

深入javascript——無處不在的this

Scorpion / 946人閱讀

摘要:由于匿名函數(shù)的作用域是全局性的,因此閉包的通常指向全局對(duì)象調(diào)用返回值為而不是我們預(yù)期的,在閉包中函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),要特別注意,該方法內(nèi)部匿名函數(shù)的指向的是全局變量。

  

有人的地方就有江湖,有函數(shù)的地方就有this。而this在不同的環(huán)境下,又表現(xiàn)為不同的形式,難免讓人有種此this非彼this的疑惑

在java等面向?qū)ο蟮恼Z言中,this指的就是當(dāng)前對(duì)象,而在javascript中這就不靈了,javascript中this是在編譯期動(dòng)態(tài)綁定的,這就形成了一把雙刃劍:足夠靈活卻又容易讓人迷惑。在javascript中this可以是全局對(duì)象、當(dāng)前對(duì)象甚至任意對(duì)象(obj.call(this))。
我們通過函數(shù)的幾種不同調(diào)用方式來看一下各自this的意義:

作為對(duì)象方法調(diào)用

在javascript中函數(shù)也是個(gè)對(duì)象,因此,函數(shù)可以作為一個(gè)對(duì)象的屬性出現(xiàn):

 var object = {
    name:"jeffie",
    sayWhat:function(){
        console.log(this.name + ":hello"); //jeffie:hello
    }
 }
object.sayWhat();

此處的this指向object對(duì)象,也就是函數(shù)所在的對(duì)象。

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

當(dāng)函數(shù)直接被調(diào)用時(shí),此時(shí)函數(shù)中的this指向全局變量,也就是window對(duì)象:

 function obj(){
    console.log(this);
 }
obj();//Window
構(gòu)造函數(shù)中的this

在作為構(gòu)造函數(shù)調(diào)用時(shí),this指向的是新生成的實(shí)例對(duì)象:

 function Plugin(name,type){
    this.name = name;
    this.type = type;
 }

 var plugin = new Plugin("core",1);
 console.log(plugin.name);//core
使用apply或者call調(diào)用

javascript中每個(gè)函數(shù)都包含兩個(gè)方法:apply()和call(),這兩個(gè)方法非常強(qiáng)大,它們可以切換函數(shù)的上下文執(zhí)行環(huán)境,也就是說可以修改this綁定的對(duì)象。簡(jiǎn)單來說,這兩個(gè)方法可以用來設(shè)置函數(shù)的this,兩個(gè)方法都接收兩個(gè)參數(shù),第一個(gè)參數(shù)是運(yùn)行函數(shù)的作用域,第二個(gè)參數(shù)是參數(shù)對(duì)象,唯一的區(qū)別是apply第二個(gè)參數(shù)為參數(shù)數(shù)組(Array或者arguments):

 function Plugin(name,type){
    this.name = name;
    this.type = type;
    this.debugs = function(name,type){
        console.log(this); //Object {name: "base", type: 3} 
    }
 }

 var plugin1 = new Plugin("core",1);
 var plugin2 = {name:"base",type:3};
 console.log(plugin1.debugs.call(plugin2));

通過上面的示例可以看出this值不再指向Plugin對(duì)象了,而是指向了plugin2的對(duì)象。

閉包中使用this

通常我們理解this對(duì)象是運(yùn)行時(shí)基于函數(shù)綁定的,全局函數(shù)中this對(duì)象就是window對(duì)象,而當(dāng)函數(shù)作為對(duì)象中的一個(gè)方法調(diào)用時(shí),this等于這個(gè)對(duì)象。由于匿名函數(shù)的作用域是全局性的,因此閉包的this通常指向全局對(duì)象window:

var scope = "global";
var object = {
    scope:"local",
    getScope:function(){
        return function(){
            return this.scope;
        }
    }
}

調(diào)用object.getScope()()返回值為global而不是我們預(yù)期的local,在閉包中函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),要特別注意,該方法內(nèi)部匿名函數(shù)的this指向的是全局變量。參考上一篇閉包
這屬于 JavaScript 的設(shè)計(jì)缺陷,正確的設(shè)計(jì)方式是內(nèi)部函數(shù)的 this 應(yīng)該綁定到其外層函數(shù)對(duì)應(yīng)的對(duì)象上,為了規(guī)避這一設(shè)計(jì)缺陷,聰明的 JavaScript 程序員想出了變量替代的方法,只需要把外部函數(shù)作用域的this存放到一個(gè)閉包能訪問的變量里面即可,約定俗成,該變量一般被命名為 that:

var scope = "global";
var object = {
    scope:"local",
    getScope:function(){
        var that = this;
        return function(){
            return that.scope;
        }
    }
}
object.getScope()()返回值為local。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87605.html

相關(guān)文章

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

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

    PrototypeZ 評(píng)論0 收藏0
  • 深入理解JavaScript:函數(shù)中this指什么?

    摘要:到底是什么函數(shù)被調(diào)用時(shí)的位置是動(dòng)態(tài)的箭頭函數(shù)不在此范圍,因?yàn)樗氖呛瘮?shù)定義時(shí)的上下文,是靜態(tài)的判斷規(guī)則如果是在中調(diào)用,則為新創(chuàng)建的對(duì)象通過,調(diào)用,是之前定的對(duì)象第一個(gè)參數(shù)注意若第一個(gè)參數(shù)是,則執(zhí)行第四條判斷規(guī)則在么某個(gè)上下文中調(diào)用,是該上下 this到底是什么? 函數(shù)被調(diào)用時(shí)的位置(是動(dòng)態(tài)的!)(箭頭函數(shù)不在此范圍,因?yàn)樗膖his是函數(shù)定義時(shí)的上下文,是靜態(tài)的!) 判斷規(guī)則 1.如果...

    fuyi501 評(píng)論0 收藏0
  • JavaScript - 收藏集 - 掘金

    摘要:插件開發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實(shí)現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。插....

    izhuhaodev 評(píng)論0 收藏0
  • JavaScriptthis指向深入解析

    普通函數(shù)的this指向 簡(jiǎn)單說說 首先,按照慣例,我們先舉個(gè)栗子: var bar = 2; function foo() { this.bar = 1; this.getBar = function() { console.log(this.bar); } } var test = new foo(); var getBar = test.getBar; test.getB...

    AlphaGooo 評(píng)論0 收藏0
  • 深入理解ES6》筆記——擴(kuò)展對(duì)象功能性(4)

    摘要:將對(duì)象的屬性拷貝到了對(duì)象,合并成一個(gè)新的對(duì)象。而這種行為也是新增的標(biāo)準(zhǔn)。總結(jié)本章講解了對(duì)象字面量語法拓展,新增方法,允許重復(fù)的對(duì)象字面量屬性,自有枚舉屬性排序,增強(qiáng)對(duì)象原型,明確了方法的定義。但是,就算把全部新增的功能記住也不是難事。 變量功能被加強(qiáng)了、函數(shù)功能被加強(qiáng)了,那么作為JavaScript中最普遍的對(duì)象,不加強(qiáng)對(duì)得起觀眾嗎? 對(duì)象類別 在ES6中,對(duì)象分為下面幾種叫法。(不需...

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

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

0條評(píng)論

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