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

資訊專欄INFORMATION COLUMN

理解JavaScript中的this關(guān)鍵詞

paulquei / 2230人閱讀

摘要:除此之外,還有一種情況也會修改,在一些庫中傳入回調(diào)函數(shù),可能會強(qiáng)制改變的綁定,例如在中本例中的就是被強(qiáng)制改變綁定到了觸發(fā)事件的元素上。它們的第一個參數(shù)是一個對象,它們會把這個對象綁定到,接著在調(diào)用函數(shù)時指定這個。

理解JavaScript中的this關(guān)鍵詞
this關(guān)鍵詞是JavaScript語言中一個很重要,同時也是一個非常復(fù)雜的機(jī)制,它同時也是一個很特殊的關(guān)鍵詞,它一般會被自動定義在函數(shù)的作用域中。不少很有經(jīng)驗(yàn)的開發(fā)者也經(jīng)常會被this的指向搞暈,當(dāng)開發(fā)者搞不清楚它的指向的時候,內(nèi)心的感受實(shí)際上差不多是這個樣子:
接下來我們將會具體討論this關(guān)鍵詞到底指向什么。
this的綁定規(guī)則

首先明確一點(diǎn),this的綁定和函數(shù)的聲明位置是沒有任何關(guān)系的,它只取決于函數(shù)的調(diào)用位置和調(diào)用方式。

1. 默認(rèn)綁定

首先我們先看一下最常見的也是最簡單的函數(shù)調(diào)用,全局中的獨(dú)立的函數(shù)調(diào)用:

var a = "hello";
function foo() {
  console.log(this.a);
}
foo();// "hello"

眾所周知,聲明在全局作用域中的變量,就是全局對象(window或者global)的一個同名的屬性,在本例中,this.a被解析成了全局變量a,而函數(shù)foo就是在直接在全局對象下、不帶有任何修飾地進(jìn)行調(diào)用的,所以,this的默認(rèn)綁定規(guī)則就是指向全局對象。但是,當(dāng)我們使用嚴(yán)格模式(strict)進(jìn)行開發(fā)的時候,情況發(fā)生了變化

"use strict";
var a = "hello";
function foo() {
  console.log(this.a);
}
foo();// undefined

在嚴(yán)格模式下,this被禁止綁定到全局對象中,所以在本例中,this指向了undefined。

2.作為對象方法的調(diào)用

看下面的代碼:

var a ="world";
var foo = function () {
  console.log(this.a);
};
var obj = {
  a:"hello",
  b:foo
};
obj.b(); //"hello"

本例中,分別在全局對象中定義變量a,和在全局對象中定義屬性obj.a,運(yùn)行結(jié)果是this被綁定到了被調(diào)用函數(shù)所在的對象中,而并非是全局對象中的a,或者你可以說,this指向了該函數(shù)的上級對象中。但是嚴(yán)格來說,無論是直接在obj對象中直接定義,還是先在全局對象中定義再添加到obj中,foo函數(shù)都并不屬于obj對象,然而調(diào)用位置會使用obj的上下文來引用函數(shù)。簡單說,當(dāng)函數(shù)引用有上下文對象時,隱式綁定規(guī)則會將函數(shù)調(diào)用中的this綁定到這個上下文對象中。

3.在構(gòu)造函數(shù)及prototype里的調(diào)用
var Foo = function () {
  this.a = "hello";
}
Foo.prototype.bar = function () {
   console.log(this.a);
};
Foo.prototype.bar2 = function () {
   this.bar();
};
var foo = new Foo();
foo.bar2();//"hello"

本例與上例類似,this在“Foo類”(嚴(yán)格說Foo是應(yīng)該是構(gòu)造函數(shù),但一般在開發(fā)過程中認(rèn)為Foo是類,這樣有助于在面向?qū)ο缶幊讨袦p少誤解)中綁定的是“類”里的共有變量和共有方法。

this隱式綁定丟失

上述的幾種應(yīng)用場景還是非常容易理解的,也是比較符合我們對this字面意義的理解的,相信對JavaScript有過接觸和研究的童鞋很快就會掌握。下面將繼續(xù)介紹幾種讓人感覺匪夷所思的this綁定丟失。
思考以下代碼:

var a = "world";
function foo (){
   console.log(this.a);
}
var obj = {
  a:"hello",
  foo:foo
};
var bar = obj.foo; //函數(shù)別名
bar(); //"world"

代碼執(zhí)行完成后,我們看到this被綁定到了(或者說指向了)全局對象上,而并不是和前幾種情況下綁定到obj對象中,這是為啥呢?
雖然barobj.foo的一個引用,但是實(shí)際上它引用的是foo函數(shù)本身,因此此時bar其實(shí)是一個不帶任何修飾的函數(shù)調(diào)用,因此適用于默認(rèn)綁定情況。
下面再來看看回調(diào)函數(shù)中this的綁定情況

function foo() {
  console.log(this.a);
}
function do(fnc) {
  fnc();
};
var obj = {
  a:2,
  foo:foo
};
var a = "world";
do(obj.foo);//"world"

參數(shù)傳遞其實(shí)就是一種隱式賦值,因此傳入函數(shù)時也會被隱式賦值,所以結(jié)果和上一個例子沒有區(qū)別,即便是將函數(shù)傳入語言內(nèi)置的的函數(shù)(比如setTimeout())中,結(jié)果也是沒有區(qū)別的,this要么被綁定到全局對象中,要么綁定到undefined。
除此之外,還有一種情況也會修改this,在一些JavaScript庫中傳入回調(diào)函數(shù),可能會強(qiáng)制改變this的綁定,例如在jquery中

$("#some-id").on("click",function () {
  console.log(this.id);//"some-id"
});

本例中的this就是被強(qiáng)制改變綁定到了觸發(fā)事件的DOM元素上。

顯式綁定

隱式綁定實(shí)際上就是在一個對象的內(nèi)部包含一個指向函數(shù)的屬性,并通過這個屬性間接地引用屬性,從而把this間接地綁定到這個對象上。
我們可以使用callapply兩個函數(shù)進(jìn)行顯式綁定。它們的第一個參數(shù)是一個對象,它們會把這個對象綁定到this,接著在調(diào)用函數(shù)時指定這個this。

var a = "world";
function foo() {
  console.log(this.a);
}
var obj = {
  a:"hello"
};
foo.call(obj);//"hello"
foo() //"world"
單純的實(shí)現(xiàn)this綁定的功能的話,callapply是一樣的,它們的區(qū)別體現(xiàn)在別的參數(shù)中。

思考下面的代碼:

function foo() {
  console.log(this.a);
}
var obj = {
  a:"hello"
};
function bar() {
  foo.call(obj);
}
bar(); //"hello"
setTimeout(bar,500);// "hello"
bar.call(window); //"hello",硬綁定的bar不能再修改它的this

我們創(chuàng)建了函數(shù)bar,并且手動在它的內(nèi)部調(diào)用foo.call(obj),因此強(qiáng)制把foothis綁定到obj,之后無論怎么調(diào)用函數(shù)bar,它總會在obj上調(diào)用foo,不會丟失,這種綁定方式被稱為硬綁定.

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

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

相關(guān)文章

  • 【譯】javascriptthis關(guān)鍵詞理解

    摘要:在中,當(dāng)使用關(guān)鍵字調(diào)用函數(shù)構(gòu)造函數(shù)時,函數(shù)構(gòu)造函數(shù)中也有這個概念,但是它不是惟一的規(guī)則,而且常常可以引用來自不同執(zhí)行上下文的不同對象。因此,我們使用調(diào)用函數(shù),可以看到這是對象,并且的屬性是正常的。 一直以來,javascript里邊的this都是一個很難理解的東西,之前看的最多的就是阮一峰老師關(guān)于this的理解: http://www.ruanyifeng.com/blo... htt...

    tainzhi 評論0 收藏0
  • 初學(xué)者徹底理解javascript閉包以及this關(guān)鍵

    摘要:理解了這句話,我們就可以來看閉包了閉包前面說過,函數(shù)可以訪問函數(shù)作用域鏈中的變量,但如果我們想在函數(shù)外訪問函數(shù)內(nèi)卻不行了。 不管是閉包還是this關(guān)鍵字,都是困擾JS初學(xué)者的比較難懂的東西,如果你對它們的認(rèn)識還不足夠清晰,那么現(xiàn)在就一起把它們掌握掉。還是那句話,我們從最基本的開始,建立起一個非常清晰的知識結(jié)構(gòu),好了,開始吧 ? 閉包 當(dāng)然我們今天說的是javascript里的閉包。要學(xué)...

    魏明 評論0 收藏0
  • 理解 JavaScript 中的 this 關(guān)鍵

    摘要:原文許多人被中的關(guān)鍵字給困擾住了,我想混亂的根源來自人們理所當(dāng)然地認(rèn)為中的應(yīng)該像中的或中的一樣工作。盡管有點(diǎn)難理解,但它的原理并不神秘。在瀏覽器中,全局對象是對象。運(yùn)算符創(chuàng)建一個新對象并且設(shè)置函數(shù)中的指向調(diào)用函數(shù)的新對象。 原文:Understanding the this keyword in JavaScript 許多人被JavaScript中的this關(guān)鍵字給困擾住了,我想混亂的...

    jayzou 評論0 收藏0
  • 如何理解JavaScriptthis關(guān)鍵

    摘要:原文鏈接參考深入理解原型和閉包完結(jié)王福朋博客園中的作用域詳解博客園 前言 王福朋老師的 JavaScript原型和閉包系列 文章看了不下三遍了,最為一個初學(xué)者,每次看的時候都會有一種 大徹大悟 的感覺,而看完之后卻總是一臉懵逼。原型與閉包 可以說是 JavaScirpt 中理解起來最難的部分了,當(dāng)然,我也只是了解到了一些皮毛,對于 JavaScript OOP 更是缺乏經(jīng)驗(yàn)。這里我想總...

    Yangder 評論0 收藏0
  • 10個流行的JavaScript面試題

    摘要:然而,異步函數(shù)不會立即被推入調(diào)用堆棧,而是會被推入任務(wù)隊列,并在調(diào)用堆棧為空后執(zhí)行。將事件從任務(wù)隊列傳輸?shù)秸{(diào)用堆棧稱為事件循環(huán)。我們調(diào)用接受和或返回另一個函數(shù)稱為高階函數(shù)的函數(shù)。 為了保證可讀性,本文采用意譯而非直譯 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 1.如何理解 JS 中的this關(guān)鍵字? JS 初學(xué)者總是對 this 關(guān)鍵字感到困惑,因?yàn)榕c其他現(xiàn)...

    CollinPeng 評論0 收藏0

發(fā)表評論

0條評論

paulquei

|高級講師

TA的文章

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