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

資訊專欄INFORMATION COLUMN

JavaScript初學(xué)者必看“this”

BlackMass / 778人閱讀

摘要:因?yàn)殛P(guān)鍵字沒有處于一個(gè)聲明的對象內(nèi)部,默認(rèn)指向全局對象。這一點(diǎn)可能對于大部分初學(xué)者來說有點(diǎn)難以理解。函數(shù)會返回一個(gè)函數(shù),并且將綁定好。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,得到了金山軟件百姓網(wǎng)等眾多知名用戶的認(rèn)可。

譯者按: JavaScript的this和Java等面向?qū)ο笳Z言中的this大不一樣,bind()call()apply()函數(shù)更是將this的靈活度進(jìn)一步延伸。

原文: JavaScript: The Keyword ‘This’ for Beginners

譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。

如果對JavaScript的關(guān)鍵字this理解不夠深刻,有時(shí)候會掉入意想不到的坑。在這里我們總結(jié)了5條通用規(guī)則來幫助你判斷this到底指向什么。雖然沒有囊括所有的情況,但日常大部分情況都可以使用這些規(guī)則來正確推斷。

this的值通常是由所在函數(shù)的執(zhí)行環(huán)境決定,也就是說要看函數(shù)是如何被調(diào)用的;

同一個(gè)函數(shù)每一次調(diào)用,this都可能指向不同的對象;

全局對象 (Global Object)

打開Chrome瀏覽器開發(fā)者面板(Windows: Ctrl + Shift + J)(Mac: Cmd + Option + J),并且輸入:

console.log(this);

看看輸出了什么?

// Window {}

window對象! 因?yàn)樵谌肿饔糜蛳拢?b>this指向全局對象。在瀏覽器中全局對象就是window對象。
為了讓你更加清楚理解為什么this會指向window對象,我們來看另外一個(gè)例子:

var myName = "Brandon";

我們可以通過在控制臺輸入myName來訪問其值:

myName
// 輸出 "Brandon"

其實(shí),所有在全局定義的變量都綁定到window對象。我們來做如下測試:

window.myName
// 輸出 "Brandon"
window.myName === myName
// 輸出 true

現(xiàn)在我們將this放到函數(shù)內(nèi)部,看看有何效果。

function test(){
  return this;
}
test();

你會發(fā)現(xiàn)this依然指向全局的window對象。因?yàn)?b>this關(guān)鍵字沒有處于一個(gè)聲明的對象內(nèi)部,默認(rèn)指向全局window對象。這一點(diǎn)可能對于大部分初學(xué)者來說有點(diǎn)難以理解。當(dāng)讀完這篇文章,你就會豁然開朗。
注意:如果在strcit模式下,上面的例子中thisundefined

聲明的對象 (Declared Object)

當(dāng)this關(guān)鍵字在一個(gè)聲明對象內(nèi)部使用,其值會被綁定到調(diào)用該this的函數(shù)的最近的父對象。我們用例子來說明這個(gè)問題:

var person = {
  first: "John",
  last: "Smith",  
  full: function() {
    console.log(this.first + " " + this.last);
  }
};
person.full();
// 輸出 "John Smith"

在被聲明的對象person中的full函數(shù)里面使用了this, 那么調(diào)用thisfull函數(shù)的最近的父對象就是person, 因此,this指向person

為了更好的描述this實(shí)際上是指向person對象的,你可以拷貝如下代碼到瀏覽器控制臺,將this打印出來。

var person = {
  first: "John",
  last: "Smith",  
  full: function() {
    console.log(this);
  }
};
person.full();
// 輸出 Object {first: "John", last: "Smith", full: function}

我們接下來看一個(gè)更復(fù)雜的例子:

var person = {
  first: "John",
  last: "Smith",
  full: function() {
    console.log(this.first + " " + this.last);
  },
  personTwo: {
    first: "Allison",
    last: "Jones",
    full: function() {
      console.log(this.first + " " + this.last);
    }
  }
};

在這里我們有嵌套的對象,在這個(gè)時(shí)候,this分別指向誰呢? 我們將其打印出來看一看:

person.full();
// 輸出 "John Smith"
person.personTwo.full();
// 輸出 "Allison Jones"

你會發(fā)現(xiàn)滿足我們前面所描述的規(guī)則:其值會被綁定到調(diào)用this的函數(shù)的最近的父對象。

new關(guān)鍵字

當(dāng)使用new關(guān)鍵字構(gòu)建一個(gè)新的對象,this會綁定到這個(gè)新對象。我們來看一個(gè)例子:

function Car(make, model) {
  this.make = make;
  this.model = model;
};

根據(jù)第一條規(guī)則,你可能會推斷this指向全局對象。但是如果我們使用new關(guān)鍵字來聲明一個(gè)新的變量,Car函數(shù)中的this將會綁定一個(gè)新的空對象,然后初始化this.makethis.model的值。

var myCar = new Car("Ford", "Escape");
console.log(myCar);
// 輸出 Car {make: "Ford", model: "Escape"}
call, bind, 和apply

我們可以顯示的在call()bind()apply()中設(shè)置this的綁定對象。這三個(gè)函數(shù)很類似,但是我們需要注意它們微小的區(qū)別。

我們來看一個(gè)例子:

function add(c, d) {
  console.log(this.a + this.b + c + d);
}
add(3,4);
// 輸出 NaN

add函數(shù)輸出NaN, 因?yàn)?b>this.a和this.b未定義。

現(xiàn)在我們引入對象,并且使用call()apply()來調(diào)用:

function add(c, d) {
  console.log(this.a + this.b + c + d);
}
var ten = {a: 1, b: 2};
add.call(ten, 3, 4);
// 輸出 10
add.apply(ten, [3,4]);
// 輸出 10

當(dāng)我們使用add.call(),第一個(gè)參數(shù)是this需要綁定的對象,剩下的是add函數(shù)本來的參數(shù)。
因此,this.a指向ten.a,this.b指向ten.badd.apply()也類似,除了第二個(gè)參數(shù)是一個(gè)數(shù)組,用于存儲add函數(shù)的參數(shù)。

bind()函數(shù)和call()類似,但是bind()函數(shù)不會立即被調(diào)用。bind()函數(shù)會返回一個(gè)函數(shù),并且將this綁定好。接下來我們來用例子來幫助理解bind()函數(shù)的應(yīng)用場景:

var small = {
  a: 1,
  go: function(b,c,d){
    console.log(this.a+b+c+d);
  }
}
var large = {
  a: 100
}

執(zhí)行:

small.go(2, 3, 4);
// 輸出 10

如果我們想使用large.a的值,而不是small.a呢? 我們可以使用call/apply:

small.go.call(large, 2, 3, 4);
// 輸出 109

但是,如果我們現(xiàn)在還不知道這三個(gè)參數(shù)應(yīng)該傳入什么值,應(yīng)該怎么辦呢? 我們可以使用bind:

var bindTest = small.go.bind(large, 2);

如果我們將bindTest在控制臺下打印出來,我們會看到:

console.log(bindTest);
// 輸出 function (b,c,d){console.log(this.a+b+c+d);}

注意:該函數(shù)已經(jīng)將this綁定到large對象,并且傳入了第一個(gè)參數(shù)b。所以,我們接下來是需要傳入余下的參數(shù)即可:

bindTest(3, 4);
// 輸出 109
箭頭函數(shù)(=>)

因?yàn)樾枰艽蟮钠覀儠iT寫一篇博客來介紹。

結(jié)論

當(dāng)你讀完這篇博客,你應(yīng)該可以理解大多數(shù)情況下this指向的對象。
接下來我們來總結(jié)一下:

this的值通常是由當(dāng)前函數(shù)的執(zhí)行環(huán)境所決定;

在全局作用域,this指向全局對象 (window對象);

當(dāng)使用new關(guān)鍵字聲明,this指向新建對象;

我們可以使用call(), bind(), apply()來設(shè)置this

箭頭函數(shù)不會綁定this

關(guān)于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了9億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!

版權(quán)聲明

轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/05/17/javascript-this-for-beginners/

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

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

相關(guān)文章

  • JavaScript學(xué)者必看“箭頭函數(shù)”

    摘要:譯者按箭頭函數(shù)看上去只是語法的變動,其實(shí)也影響了的作用域。打開瀏覽器開發(fā)者控制臺,輸入我們將變量綁定到一個(gè)箭頭函數(shù),該函數(shù)有一個(gè)參數(shù)返回。或者說箭頭函數(shù)不會改變本來的綁定。最后,結(jié)束刷屏的打印總結(jié)箭頭函數(shù)寫代碼擁有更加簡潔的語法不會綁定。 譯者按: 箭頭函數(shù)看上去只是語法的變動,其實(shí)也影響了this的作用域。 原文: JavaScript: Arrow Functions for B...

    tabalt 評論0 收藏0
  • JavaScript中8個(gè)常見的陷阱

    摘要:然而,不會在年的基礎(chǔ)上加,而只是表示年。閉包這是一個(gè)經(jīng)典的面試題雖然期望輸出,然而實(shí)際上卻不會。因?yàn)榈谛械臎]有在正確的環(huán)境下執(zhí)行。 譯者按: 漫漫編程路,總有一些坑讓你淚流滿面。 原文: Who said javascript was easy ? 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。 這里我們針對JavaScri...

    doodlewind 評論0 收藏0
  • JavaScript數(shù)組去重—ES6的兩種方式

    摘要:數(shù)組的方法方法創(chuàng)建一個(gè)新的數(shù)組,新數(shù)組中的元素是通過檢查指定數(shù)組中符合條件的所有元素。可選,執(zhí)行函數(shù)時(shí)的值。刪除所有的鍵值對,沒有返回值。返回一個(gè)布爾值,表示某個(gè)鍵是否在當(dāng)前對象之中。 說明 JavaScript數(shù)組去重這個(gè)問題,經(jīng)常出現(xiàn)在面試題中,以前也寫過一篇數(shù)組去重的文章,(JavaScript 數(shù)組去重的多種方法原理詳解)但感覺代碼還是有點(diǎn)不夠簡單,今天和大家再說兩種方法,代碼...

    FrancisSoung 評論0 收藏0
  • JavaScript數(shù)組去重—ES6的兩種方式

    摘要:數(shù)組的方法方法創(chuàng)建一個(gè)新的數(shù)組,新數(shù)組中的元素是通過檢查指定數(shù)組中符合條件的所有元素。可選,執(zhí)行函數(shù)時(shí)的值。刪除所有的鍵值對,沒有返回值。返回一個(gè)布爾值,表示某個(gè)鍵是否在當(dāng)前對象之中。 說明 JavaScript數(shù)組去重這個(gè)問題,經(jīng)常出現(xiàn)在面試題中,以前也寫過一篇數(shù)組去重的文章,(JavaScript 數(shù)組去重的多種方法原理詳解)但感覺代碼還是有點(diǎn)不夠簡單,今天和大家再說兩種方法,代碼...

    lijinke666 評論0 收藏0

發(fā)表評論

0條評論

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