最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript基礎(chǔ)之this詳解

 更新時間:2017年06月04日 09:46:53   作者:fundebug  
JavaScript中函數(shù)的this對象是函數(shù)在執(zhí)行時所處的作用域(例:當(dāng)在網(wǎng)頁的全局作用域中調(diào)用函數(shù)時,this對象引用的就是window)。

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

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

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

this的值通常是由所在函數(shù)的執(zhí)行環(huán)境決定,也就是說要看函數(shù)是如何被調(diào)用的;
同一個函數(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關(guān)鍵字沒有處于一個聲明的對象內(nèi)部,默認(rèn)指向全局window對象。這一點可能對于大部分初學(xué)者來說有點難以理解。當(dāng)讀完這篇文章,你就會豁然開朗。
注意:如果在strcit模式下,上面的例子中this為undefined。

聲明的對象 (Declared Object)

當(dāng)this關(guān)鍵字在一個聲明對象內(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)用this的full函數(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}

我們接下來看一個更復(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);
  }
 }
};

在這里我們有嵌套的對象,在這個時候,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)建一個新的對象,this會綁定到這個新對象。我們來看一個例子:

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

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

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

call, bind, 和apply

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

<!-- call可以接收任意個數(shù)的參數(shù),其中第一個必須是一個this對象,其余依次是所有的參數(shù)。 -->

我們來看一個例子:

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

add函數(shù)輸出NaN, 因為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(),第一個參數(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ù)的應(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)在還不知道這三個參數(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對象,并且傳入了第一個參數(shù)b。所以,我們接下來是需要傳入余下的參數(shù)即可:

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

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

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

結(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。

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

譯者: Fundebug

相關(guān)文章

  • 深入理解JavaScript 函數(shù)

    深入理解JavaScript 函數(shù)

    下面小編就為大家?guī)硪黄钊肜斫釰avaScript 函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • js中的鼠標(biāo)事件有哪些(用法示例學(xué)習(xí)進階)

    js中的鼠標(biāo)事件有哪些(用法示例學(xué)習(xí)進階)

    在JavaScript中,鼠標(biāo)事件是 Web 開發(fā)中最常用的事件類型。鼠標(biāo)點擊事件包括 4 個:click(單擊)、dblclick(雙擊)、mousedown(按下)和 mouseup(松開)。其中 click 事件類型比較常用,而 mousedown和mouseup事件類型多用在鼠標(biāo)拖放、拉伸操作中。
    2023-02-02
  • 你真的了解JavaScript嗎?

    你真的了解JavaScript嗎?

    你真的了解JavaScript嗎?...
    2007-02-02
  • js判斷瀏覽器的比較全的代碼

    js判斷瀏覽器的比較全的代碼

    js判斷瀏覽器的比較全的代碼...
    2007-02-02
  • Javascript中引用示例介紹

    Javascript中引用示例介紹

    Javascript腳本中,引用的參數(shù)內(nèi)部可以修改,但參數(shù)對應(yīng)的引用不能修改,下面為大家詳細(xì)介紹下
    2014-02-02
  • javascript設(shè)計模式之工廠模式

    javascript設(shè)計模式之工廠模式

    這篇文章主要為大家介紹了javascript工廠模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • javascript window對象屬性整理

    javascript window對象屬性整理

    javascript window對象屬性,網(wǎng)頁愛好者經(jīng)常需要用到,大家可以收藏下,方便以后使用。
    2009-10-10
  • 菜鳥學(xué)習(xí)JavaScript小實驗之函數(shù)引用

    菜鳥學(xué)習(xí)JavaScript小實驗之函數(shù)引用

    由于變量b中保存的是函數(shù)的引用,當(dāng)函數(shù)變化時,b也隨時變化,且不管函數(shù)出現(xiàn)的先后順序。兩次alert(b),雖然位置不一樣,但是內(nèi)容相同。
    2010-11-11
  • TypeScript中的裝飾器用法

    TypeScript中的裝飾器用法

    這篇文章介紹了TypeScript中裝飾器的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • JavaScript 學(xué)習(xí)初步 入門教程

    JavaScript 學(xué)習(xí)初步 入門教程

    看了《21天學(xué)習(xí)JavaScript》的視頻教程,感覺就是語法好熟悉,和C++類似,和C#類似,和Java類似!幡然悔悟這些語言的語法都是類似的,數(shù)據(jù)類型,對象方法(或者稱之為函數(shù),由于我是個菜鳥所以也數(shù)不清楚到底是什么)。
    2010-03-03

最新評論

敦煌市| 灯塔市| 金川县| 邛崃市| 隆尧县| 东乡县| 广东省| 大厂| 邵阳县| 贺兰县| 公安县| 雷州市| 开江县| 云阳县| 扎囊县| 尼玛县| 永平县| 盐津县| 德庆县| 定结县| 泰宁县| 泰来县| 木兰县| 疏附县| 南溪县| 荥阳市| 玉环县| 扶余县| 库车县| 芦溪县| 博客| 陆丰市| 长葛市| 连江县| 横山县| 棋牌| 屏东县| 辽阳市| 龙江县| 寿阳县| 遂宁市|