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

資訊專欄INFORMATION COLUMN

Javascript中this基礎(chǔ)應(yīng)用

NicolasHe / 643人閱讀

摘要:不過,匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向。示例如下依然指向全局全局方法指向匿名函數(shù)目前為止,一切都符合預(yù)期表現(xiàn)。指向指向全局調(diào)用對(duì)象方法調(diào)用方法內(nèi)部方法雖然有點(diǎn)繞,但是還是可以明白的,指向調(diào)用方法該對(duì)象,匿名函數(shù)指向全局。

前言

以下內(nèi)容只針對(duì)非嚴(yán)格模式,嚴(yán)格模式區(qū)不說了
如果看過《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》的人都應(yīng)該有印象,里面關(guān)于this對(duì)象是這么形容的

this 對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this等于window,而當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí),this 等于那個(gè)對(duì)象。不過,匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對(duì)象通常指向 window。
demo1

示例如下

var a = 10,
  obj = {
    a: 20
  };

function log() {
  var a = 30;
  console.log(this.a); //依然指向全局
};

console.log(this.a); // 全局
log(); //方法
log.call(obj); //指向obj

;
(function () {
  console.log(this.a) //匿名函數(shù)
})()

// 10
// 10
// 20
// 10

目前為止,一切都符合預(yù)期表現(xiàn)。然后我們?cè)倏葱?fù)雜點(diǎn)的寫法。

demo2
var a = 10,
  obj = {
    a: 20,
    log: function () {
      console.log(this.a); //指向obj
    }
  };

function log() {
  function _log() {
    console.log(this.a); //指向全局
  };
  _log();
};

obj.log(); //調(diào)用對(duì)象方法
log(); //調(diào)用方法內(nèi)部方法

// 20
// 10

雖然有點(diǎn)繞,但是還是可以明白的,this指向調(diào)用方法該對(duì)象,匿名函數(shù)this指向全局。
看到這里我們好像已經(jīng)大概明白this是怎么一回事了,然后我們?cè)賹憦?fù)雜點(diǎn)

demo3
var a = 10,
  obj = {
    a: 20,
    b: this.a + 30
  };
console.log(obj.b); // 40

是不是又猛的懷疑人生了?明明應(yīng)該this是指向obj得出50,為什么會(huì)指向全局得出40的???
想想上面說的當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí), this 等于那個(gè)對(duì)象。難道屬性值又是另一回事?
帶著疑問我們直接打印出this看看

var a = 10,
  obj = {
    a: 20,
    b: this
  };
console.log(obj.b === window); //true

所以屬性值里的this真的指向全局,于是我們可以假設(shè)得出一個(gè)結(jié)論:當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí), this 等于那個(gè)對(duì)象,而某個(gè)對(duì)象的屬性值的this是直接指向全局的
聽起來好拗口,是不是意思對(duì)象的方法this指向?qū)ο?,屬性值指向全??

demo4

帶著疑問我們直接看例子

var a = 10,
  obj = {
    a: 20,
    log: function () {
      console.log(this.a);
    }
  };
var fn = obj.log;
fn(); //調(diào)用賦值方法10

正如前面所說,當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí), this 等于那個(gè)對(duì)象。如果不是該對(duì)象直接調(diào)用時(shí),this指向調(diào)用對(duì)象。
基于這個(gè)結(jié)論,即使中間經(jīng)過幾層函數(shù)調(diào)用也一樣的

var a = 10,
  obj = {
    a: 20,
    log: function () {
      console.log(this.a); //指向obj
    }
  };

function all_log(fn) {
  fn();
}

all_log(obj.log); // 10

看到了吧,即使經(jīng)過一個(gè)中間函數(shù)調(diào)用,實(shí)際相當(dāng)于window調(diào)用對(duì)象方法,所以this也是指向全局的.

demo5

然后看看經(jīng)常會(huì)用到的函數(shù)return出的this指向

var a = 10,
  obj = {
    a: 20,
    log: function () {
      return function () {
        console.log(this.a); //指向??
      }
    }
  };
obj.log()(); //10

衹要基礎(chǔ)稍好也能理解,因?yàn)閛bj.log()返回一個(gè)匿名函數(shù),然后相當(dāng)于在全局下再調(diào)用匿名函數(shù),因此this直接指向全局了。書里官方點(diǎn)的解釋就是

每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得兩個(gè)特殊變量: thisarguments。內(nèi)部函數(shù)在搜索這兩個(gè)變量時(shí),只會(huì)搜索到其活動(dòng)對(duì)象為止,因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個(gè)變量(例子是指obj)

需要注意的是如果沒有明確指向全局的話this實(shí)際上都是指向undefined的,衹是非嚴(yán)格模式下,它會(huì)被自動(dòng)指向全局對(duì)象。

function log() {
  "use strict";
  console.log(this === window);
}

log(); // 獨(dú)立調(diào)用false
window.log(); // window下調(diào)用 true
demo6

書里還提到一個(gè)挺有意思的寫法

var a = 10,
  obj = {
    a: 20,
    log: function () {
      console.log(this.a); //指向??
    }
  };
(obj.log = obj.log)(); //先賦值再調(diào)用 10

你會(huì)發(fā)現(xiàn)居然this也指向全局了。
因?yàn)榇a先執(zhí)行了一條賦值語句,然后再調(diào)用賦值后的結(jié)果。因?yàn)檫@個(gè)賦值表達(dá)式的值是函數(shù)本身,所以 this 的值不能得到維持,結(jié)果就返回了10。

demo7

如果是作為構(gòu)造函數(shù)使用的情況下

function Person() {
  this.name = "mike";
  this.log = function () {
    console.log(this);
  }
};

var man = new Person();
man.log();//Person {name: "mike", log: function}

里面的this是指向new出來的對(duì)象,詳情可以看看我之前寫的博文關(guān)于Javascript中的new運(yùn)算符,構(gòu)造函數(shù)與原型鏈一些理解

demo8

還有種情況是通過callapply修改this指向,它會(huì)強(qiáng)制指向方法的第一個(gè)參數(shù)

var a = 10,
  obj = {
    a: 20
  };

function log() {
  console.log(this.a);
};

log.call(obj); //指向obj
log.apply(obj); //指向obj
基于上面的情況,我們可以得出幾個(gè)結(jié)論

1, this 對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的
2, 如果沒有明確指向全局的話this實(shí)際上都是指向undefined的,衹是非嚴(yán)格模式下,它會(huì)被自動(dòng)指向全局對(duì)象
3, 當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí),this 等于那個(gè)對(duì)象
4, 當(dāng)某個(gè)對(duì)象的屬性值里的this是直接指向全局對(duì)象
5, 匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對(duì)象通常指向全局對(duì)象
6, 構(gòu)造函數(shù)中的this會(huì)指向它實(shí)例化對(duì)象
7, call或apply方法能強(qiáng)制修改this指向方法指定對(duì)象

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

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

相關(guān)文章

  • 學(xué)習(xí)React之前你需要知道的的JavaScript基礎(chǔ)知識(shí)

    摘要:和類在開始時(shí)遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語法,但也包括三元運(yùn)算符,語言中的簡(jiǎn)寫版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...

    bitkylin 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)心法——call apply bind

    摘要:原文地址基礎(chǔ)心法歡迎。也就是說,這三個(gè)方法可以改變函數(shù)體內(nèi)部的指向。令為一個(gè)空列表。提供作為值并以作為參數(shù)列表,調(diào)用的內(nèi)部方法,返回結(jié)果。在外面?zhèn)魅氲闹禃?huì)修改并成為值。語法其中,就是指向,是指定的參數(shù)。 原文地址:JavaScript基礎(chǔ)心法——call apply bind 歡迎star。 如果有錯(cuò)誤的地方歡迎指正。 整理call、apply、bind這三個(gè)方法的的知識(shí)點(diǎn)。 之前...

    techstay 評(píng)論0 收藏0
  • [譯] 在你學(xué)習(xí) React 之前必備的 JavaScript 基礎(chǔ)

    摘要:前言在理想的狀態(tài)下,你可以在深入了解之前了解和開發(fā)的所有知識(shí)。繼承另一個(gè)類的類,通常稱為類或類,而正在擴(kuò)展的類稱為類或類。這種類型的組件稱為無狀態(tài)功能組件。在你有足夠的信心構(gòu)建用戶界面之后,最好學(xué)習(xí)。 原文地址:JavaScript Basics Before You Learn React 原文作者: Nathan Sebhastian 寫在前面 為了不浪費(fèi)大家的寶貴時(shí)間,在開...

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

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

0條評(píng)論

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