用最簡(jiǎn)單的方法判斷JavaScript中this的指向(推薦)
都說(shuō) JavaScript 是一種很靈活的語(yǔ)言,這其實(shí)也可以說(shuō)它是一個(gè)混亂的語(yǔ)言。它把 函數(shù)式編程 和 面向?qū)ο缶幊?糅合一起,再加上 動(dòng)態(tài)語(yǔ)言 特性,簡(jiǎn)直強(qiáng)大無(wú)比(其實(shí)是不能和C++比的,^_^ )。
JS 里的 this
- 在 function 內(nèi)部被創(chuàng)建
- 指向調(diào)用時(shí)所在函數(shù)所綁定的對(duì)象(拗口)
- this 不能被賦值,但可以被 call/apply 改變
目錄
* 一個(gè)特例
* 開(kāi)始判斷
* 法則一:對(duì)象方法中的this指向?qū)ο蟊旧恚^函數(shù)形式的除外)
* 法則二:多層嵌套函數(shù)中的this指向等同于包含該this的最近一個(gè)function的this
* 法則三:箭頭函數(shù)以及非指向?qū)ο蠓椒ㄖ械膄unction的情況下this指向window
* 習(xí)題集
* 普通函數(shù)中的this
* 函數(shù)執(zhí)行后返回另外一個(gè)函數(shù)中的this(普通函數(shù)中)
* 多層嵌套函數(shù)中的this(定時(shí)器&箭頭函數(shù))1
* 多層嵌套函數(shù)中的this(定時(shí)器&箭頭函數(shù))2
一個(gè)特例
在正式開(kāi)始之前,我們先來(lái)說(shuō)一個(gè)特例。
// 構(gòu)造函數(shù)
function Student(name) {
this.name = name
}
// 創(chuàng)建小明和小紅兩個(gè)實(shí)例
var XM = new Student('xiaoming')
var XH = new Student('xiaohong')
// 輸出信息
console.log(XM) // Student {name: "xiaoming"}
console.log(XH) // Student {name: "xiaohong"}
在構(gòu)造函數(shù)中,this上的值會(huì)在創(chuàng)建實(shí)例的時(shí)候被綁定到新創(chuàng)建的實(shí)例上。不適用于下面的判斷方法,所以特此說(shuō)明。
開(kāi)始判斷
下面是一個(gè)典型例子,我們的分析從這里開(kāi)始。
var x = {
name: 'bw2',
getName1: function() {
console.log(this)
},
getName2: function() {
setTimeout(() => {
console.log(this)
},0)
},
getName31: () => {
console.log(this)
},
getName32: function() {
return function() {
console.log(this)
}
}
}
x.getName1() // {name: "bw2", getName1: ƒ}
x.getName2() // {name: "bw2", getName1: ƒ}
x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
法則一:對(duì)象方法中的this指向?qū)ο蟊旧恚^函數(shù)形式的除外)
var x = {
name: 'bw2',
getName1: function() {
console.log(this)
}
}
x.getName1() // {name: "bw2", getName1: ƒ}
法則二:多層嵌套函數(shù)中的this指向等同于包含該this的最近一個(gè)function的this
箭頭函數(shù)沒(méi)有獨(dú)立的this作用域,所以繼續(xù)往外層走,走到了getName: function(){}。那么就是他了,this指向等同于這個(gè)function內(nèi)部的this指向。根據(jù)法則一,this指向?qū)ο蟊旧怼?/p>
var x = {
name: 'bw2',
getName2: function() {
console.log(this) // 等同于此處的this
setTimeout(() => {
console.log(this) // 原始的this位置
},0)
}
}
x.getName2() // {name: 'bw2', getName1: ƒ}
我們可以試著在瀏覽器中運(yùn)行,看看結(jié)果。
法則三:箭頭函數(shù)以及非指向?qū)ο蠓椒ㄖ械膄unction的情況下this指向window
根據(jù)法則二,this是指向最近的function,因此,這里的this等同于返回的函數(shù)中的this,不是對(duì)象方法中的this,所以,指向全局。
是不是感覺(jué)有點(diǎn)奇怪?不過(guò)實(shí)踐證明確實(shí)如此。
var x = {
name: 'bw2',
getName31: () => {
console.log(this)
},
getName32: function() {
return function() {
console.log(this)
}
}
}
x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
習(xí)題集
歡迎大家按照法則一到三依次判斷,猜測(cè)結(jié)果,并在瀏覽器下測(cè)試。測(cè)試結(jié)果也可以回復(fù),大家一起討論。
因本人能力有限,該系列法則可能在部分情況下失效。歡迎大家一起討論。
下面是做題時(shí)間。
普通函數(shù)中的this
function x() {
console.log(this)
}
x()
函數(shù)執(zhí)行后返回另外一個(gè)函數(shù)中的this(普通函數(shù)中)
function xx(){
return function() {
console.log(this)
}
}
xx()()
多層嵌套函數(shù)中的this(定時(shí)器&箭頭函數(shù))1
var x = {
name: 'bw2',
getName: () => {
setTimeout(() => {
console.log(this)
},0)
}
}
x.getName()
多層嵌套函數(shù)中的this(定時(shí)器&箭頭函數(shù))2
var x = {
name: 'bw2',
getName: () => {
setTimeout(function() {
console.log(this)
},0)
}
}
x.getName()
再次說(shuō)明,該法則為實(shí)驗(yàn)性法則,未進(jìn)行大范圍的測(cè)試,不保證在所有情況下都有一致的結(jié)果。如果你發(fā)現(xiàn)了法則判斷失敗的情況,歡迎留言,一起探討。
總結(jié)
以上所述是小編給大家介紹的Mysql 5.7.19 winx64 ZIP Archive 安裝及使用教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- js綁定事件this指向發(fā)生改變的問(wèn)題解決方法
- JavaScript call apply使用 JavaScript對(duì)象的方法綁定到DOM事件后this指向問(wèn)題
- 我所理解的JavaScript中的this指向
- JavaScript this在函數(shù)中的指向及實(shí)例詳解
- 淺談JS中幾種輕松處理''this''指向方式
- js中的this的指向問(wèn)題詳解
- 詳解JavaScript中關(guān)于this指向的4種情況
- js中this的指向問(wèn)題歸納總結(jié)
- 老生常談JavaScript面向?qū)ο蠡A(chǔ)與this指向問(wèn)題
- 關(guān)于JavaScript中的this指向問(wèn)題總結(jié)篇
- JS中this的4種綁定規(guī)則詳解
- 詳解JavaScript的this指向和綁定
相關(guān)文章
提高網(wǎng)站性能之 如何對(duì)待JavaScript
在一個(gè)頁(yè)面中,每一個(gè)外部JavaScript 及CSS文件都會(huì)導(dǎo)致一個(gè)額外的HTTP請(qǐng)求。所以,如何合理的合并JavaScript 文件及CSS文件也是前端工程師應(yīng)該考慮的。2009-10-10
javascript實(shí)現(xiàn)的閉包簡(jiǎn)單實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)的閉包簡(jiǎn)單實(shí)現(xiàn)方法,涉及javascript閉包的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Webpack path與publicPath的區(qū)別詳解
本篇文章主要介紹了Webpack path與publicPath的區(qū)別詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
微信小程序自定義tab實(shí)現(xiàn)多層tab嵌套功能
微信小程序非?;鸨裉炷_本之家小編給大家?guī)?lái)的微信小程序自定義tab實(shí)現(xiàn)多層tab嵌套功能以及項(xiàng)目中遇到的問(wèn)題及解決方法,感興趣的朋友一起看看吧2018-06-06
JS利用ES6和ES5分別實(shí)現(xiàn)長(zhǎng)整數(shù)和字節(jié)數(shù)組互轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了長(zhǎng)整數(shù)與字節(jié)數(shù)組互轉(zhuǎn)的技術(shù)原理,文中提供了ES6(現(xiàn)代瀏覽器/Node.js)與ES5(兼容舊環(huán)境)兩套實(shí)現(xiàn)方案,需要的可以參考下2025-04-04
微信小程序?qū)崿F(xiàn)自上而下字幕滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)自上而下字幕滾動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
javascript add event remove event
javascript事件綁定和刪除功能代碼2008-04-04

