欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

JavaScript初學者必看“this”-創(chuàng)新互聯(lián)

譯者按: JavaScript的this和Java等面向對象語言中的this大不一樣,bind()、call()apply()函數(shù)更是將this的靈活度進一步延伸。

為前進等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及前進網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站建設、網(wǎng)站建設、前進網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
  • 原文: JavaScript: The Keyword ‘This’ for Beginners

  • 譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。

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

  1. this的值通常是由所在函數(shù)的執(zhí)行環(huán)境決定,也就是說要看函數(shù)是如何被調(diào)用的;
  2. 同一個函數(shù)每一次調(diào)用,this都可能指向不同的對象;

全局對象 (Global Object)

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

console.log(this);

看看輸出了什么?

// Window {}

window對象! 因為在全局作用域下,this指向全局對象。在瀏覽器中全局對象就是window對象。
為了讓你更加清楚理解為什么this會指向window對象,我們來看另外一個例子:

var myName = 'Brandon';

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

myName
// 輸出 'Brandon'

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

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

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

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

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

聲明的對象 (Declared Object)

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

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實際上是指向person對象的,你可以拷貝如下代碼到瀏覽器控制臺,將this打印出來。

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

我們接下來看一個更復雜的例子:

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);
    }
  }
};

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

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

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

new關鍵字

當使用new關鍵字構建一個新的對象,this會綁定到這個新對象。我們來看一個例子:

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

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

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

call, bind, 和apply

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

我們來看一個例子:

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

add函數(shù)輸出NaN, 因為this.athis.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

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

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

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)在還不知道這三個參數(shù)應該傳入什么值,應該怎么辦呢? 我們可以使用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對象,并且傳入了第一個參數(shù)b。所以,我們接下來是需要傳入余下的參數(shù)即可:

bindTest(3, 4);
// 輸出 109

箭頭函數(shù)(->)

因為需要很大的篇幅,我們會專門寫一篇博客來介紹。

結論

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

  1. this的值通常是由當前函數(shù)的執(zhí)行環(huán)境所決定;
  2. 在全局作用域,this指向全局對象 (window對象);
  3. 當使用new關鍵字聲明,this指向新建對象;
  4. 我們可以使用call(), bind(), apply()來設置this;
  5. 箭頭函數(shù)不會綁定this。

關于Fundebug

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

JavaScript初學者必看“this”

版權聲明

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

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網(wǎng)頁名稱:JavaScript初學者必看“this”-創(chuàng)新互聯(lián)
URL地址:http://aaarwkj.com/article28/cojejp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設、搜索引擎優(yōu)化網(wǎng)站內(nèi)鏈、企業(yè)網(wǎng)站制作、網(wǎng)站營銷、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
国产三级久久精品三级91| 中文字幕乱码在线观看一区| 日韩在线不卡一二三| 五十路六十路美熟人妻| 久久热这里只有视频精品| 午夜麻豆影网在线观看| 日日躁夜夜躁狠狠躁欧美| 91在线视频国产网站| 日韩视频 一区 二区| 亚洲综合日韩精品国产av| 日日激情综合久久一区| 午夜少妇久久久久久久久| 亚洲91精品一区二区三区| 很黄很刺激的视频中文字幕| 中国亚洲黄色录像免费看| 1区2区3区精品视频| 国产高潮呻吟久久av| 人人狠狠综合久久亚洲| 日本高清三级精品一区二区 | 久久人妻蜜桃一区二区三区| 91在线看片国产免费观看| 日本不卡视频二区三区| av在线播放网址网站| 韩国av毛片在线播放| 蜜臀av午夜福利在线观看| 久久精品国产视频在热| 亚洲三级黄片免费播放| 熟女中文字幕亚洲一区二区| 日本一区二区不卡二区| 欧美性做爰片免费视频网| 日韩女同一区二区三区在线观看| 国产精品99久久久久久宅男九| 国产国产乱老熟女视频网站| 99久久婷婷免费国产综合精品| 精品久久少妇激情视频| 欧美日韩av在线一区二区| 国产又粗又猛又爽黄老大爷| 日本熟妇色在线视频不卡| 大神厕所偷拍美女尿尿| 日本岛国大片一区二区在线观看| 亚洲精品成人午夜久久|