欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript函數(shù)中this指向問(wèn)題詳解

 更新時(shí)間:2021年05月07日 09:59:24   作者:一顆不甘墜落的流星  
這篇文章主要給大家介紹了關(guān)于JavaScript函數(shù)中this指向問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

this關(guān)鍵字

哪個(gè)對(duì)象調(diào)用函數(shù),函數(shù)里面的this指向哪個(gè)對(duì)象。

**嚴(yán)格模式下:**在全局環(huán)境中,this指向的是undefined

**非嚴(yán)格模式下:**在全局環(huán)境中,this指向的是window

全局定義的函數(shù)直接調(diào)用,this => window

function fn(){
	console.log(this);
	// 此時(shí) this 指向 window
}
fn();
// 相當(dāng)于 window.fn()

對(duì)象內(nèi)部的函數(shù)調(diào)用,this => 調(diào)用者

var obj = {
	fn:function(){
		console.log(this);
	}
}
obj.fn();
// 此時(shí) this 指向 obj

定時(shí)器的處理函數(shù),this => window

setTimeout(function(){
	console.log(this);	
},0)
// 此時(shí)定時(shí)器處理函數(shù)里面的this 指向 window

事件處理函數(shù),this => 事件源

div.onclick = function(){
	console.log(this);
}
//當(dāng)你點(diǎn)擊 div 的時(shí)候,this指向 div

自調(diào)用函數(shù),this => window

(function () {
  console.log(this)
})()
// 此時(shí) this 指向 window

改變 this 指向

剛才我們說(shuō)過(guò)的都是函數(shù)的基本調(diào)用方式里面的 this 指向,我們還有三個(gè)方法可以忽略函數(shù)本身的 this 指向轉(zhuǎn)而指向別的地方。這三個(gè)方法就是 call / apply / bind,是強(qiáng)行改變 this 指向的方法。

  • call/apply/bind附加在函數(shù)調(diào)用后面使用,可以忽略函數(shù)本身的 this 指向
  • call和apply使用時(shí)會(huì)立即自動(dòng)調(diào)用函數(shù),bind使用時(shí)會(huì)創(chuàng)建一個(gè)函數(shù),但是需要另外去手動(dòng)調(diào)用

call

語(yǔ)法:fn.call(fn 函數(shù)體內(nèi) this 的指向哪里,arg1, arg2, ...);

作用:調(diào)用被綁定的函數(shù)fn,指定它的 this 指向并傳參

參數(shù):

  • 第一個(gè)參數(shù):是 this 指向
  • 其余的參數(shù):需要傳入的值,可以是多個(gè),用逗號(hào)隔開(kāi)

使用 call 方法不傳參

var num = 666;

function fn() {
  console.log('num = ', this.num);
}

fn.call();  // num = 666

使用 call 方法指定this

var name = 'Rose';
var obj = {name:'Jack'};
function fn(){
	console.log(this.name);
}
fn();	// Rose
fn.call();	// Rose
fn.call(obj);  // jack

使用 call 方法指定this并傳參

var name = 'Rack';
var obj = {name:'Jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.call(obj,1,2);	// obj 1 2
fn(1,3);	// window 1 3

apply

apply方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組

語(yǔ)法:fn.apply(fn 函數(shù)體內(nèi) this 的指向哪里,[arg1, arg2, ...]);

作用:調(diào)用被綁定的函數(shù)fn,指定它的 this 指向并傳參

參數(shù):

  • 第一個(gè)參數(shù):this 指向的對(duì)象
  • 第二個(gè)參數(shù):一個(gè)包含多個(gè)參數(shù)的數(shù)組
var obj = {name:'jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.apply(obj,[1,2]);	// obj 1 2

使用 apply 合并數(shù)組

使用push將元素追加到數(shù)組中,如果參數(shù)是數(shù)組,它會(huì)將該數(shù)組作為單個(gè)元素添加,而不是將這個(gè)數(shù)組內(nèi)的每個(gè)元素添加進(jìn)去,因此我們最終會(huì)得到一個(gè)數(shù)組內(nèi)的數(shù)組

var arr1 = [1,2];
var arr2 = [3,4];
arr1.push(arr2);
console.log(arr1);	//	[1,2,[3,4]]	

concat雖然可以合并數(shù)組,但它并不是將元素添加到現(xiàn)有數(shù)組,而是創(chuàng)建并返回一個(gè)新數(shù)組。

var arr1 = [1,2];
var arr2 = [3,4];

var arr3 = arr1.concat(arr2);
console.log(arr1);	// [1,2]
console.log(arr3);	// [1,2,3,4]

如果我們要將元素追加到現(xiàn)有數(shù)組又該怎么做?循環(huán)?No!這是apply就派上用場(chǎng)了

var arr1 = [1,2];
var arr2 = [3,4];

arr1.push.apply(arr1,arr2);
console.log(arr1);	// [1,2,3,4]

使用 apply 與內(nèi)置函數(shù)連用

/* 找出數(shù)組中最大/小的數(shù)字 */
var numbers = [5, 6, 2, 3, 7];

var max = Math.max(numbers)
var min = Math.min(numbers)
console.log(min,max);	// NaN NaN

var max = Math.max.apply(null, numbers); 
/* 基本等同于 Math.max(numbers[0], ...) 或 Math.max(5, 6, ..) */
var min = Math.min.apply(null, numbers);
console.log(min,max);	// 2 7

bind

語(yǔ)法:fn.bind(fn 函數(shù)體內(nèi) this 的指向, arg1, arg2, ...);

作用:創(chuàng)建一個(gè)新的綁定函數(shù),指定它的 this 指向并傳參,必須調(diào)用它才會(huì)被執(zhí)行

參數(shù):

  • 第一個(gè)參數(shù):this 指向的對(duì)象
  • 其余的參數(shù):需要傳入的值,可以是多個(gè),用逗號(hào)隔開(kāi)
var obj = {name:'jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.bind(obj,1,2);	// 未調(diào)用不執(zhí)行
fn.bind(obj,1,3)()	// obj 1 3
var newFn = fn.bind(obj,3,4);
newFn();	// obj 1 4
newFn(5,6);	// obj 3 4

總結(jié)

到此這篇關(guān)于JavaScript函數(shù)中this指向問(wèn)題的文章就介紹到這了,更多相關(guān)JavaScript函數(shù)this指向內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript實(shí)現(xiàn)base64的加密解密方法示例

    Javascript實(shí)現(xiàn)base64的加密解密方法示例

    下文是base64用javascript寫出來(lái)的函數(shù)和方法。非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-06-06
  • 微信小程序?qū)崿F(xiàn)紅包功能(后端PHP實(shí)現(xiàn)邏輯)

    微信小程序?qū)崿F(xiàn)紅包功能(后端PHP實(shí)現(xiàn)邏輯)

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)紅包功能,以及后端PHP實(shí)現(xiàn)邏輯,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • javascript將中國(guó)數(shù)字格式轉(zhuǎn)換成歐式數(shù)字格式的簡(jiǎn)單實(shí)例

    javascript將中國(guó)數(shù)字格式轉(zhuǎn)換成歐式數(shù)字格式的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇javascript將中國(guó)數(shù)字格式轉(zhuǎn)換成歐式數(shù)字格式的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JavaScript中的全局對(duì)象介紹

    JavaScript中的全局對(duì)象介紹

    這篇文章主要介紹了JavaScript中的全局對(duì)象介紹,對(duì)于任何JavaScript程序,當(dāng)程序開(kāi)始運(yùn)行時(shí),JavaScript解釋器都會(huì)初始化一個(gè)全局對(duì)象以供程序使用,需要的朋友可以參考下
    2015-01-01
  • 用函數(shù)式編程技術(shù)編寫優(yōu)美的 JavaScript_ibm

    用函數(shù)式編程技術(shù)編寫優(yōu)美的 JavaScript_ibm

    函數(shù)式編程語(yǔ)言在學(xué)術(shù)領(lǐng)域已經(jīng)存在相當(dāng)長(zhǎng)一段時(shí)間了,但是從歷史上看,它們沒(méi)有豐富的工具和庫(kù)可供使用。隨著 .NET 平臺(tái)上的 Haskell 的出現(xiàn),函數(shù)式編程變得更加流行。一些傳統(tǒng)的編程語(yǔ)言,例如 C++ 和 JavaScript,引入了由函數(shù)式編程提供的一些構(gòu)造和特性。在許多情況下,JavaScript 的重復(fù)代碼導(dǎo)致了一些拙劣的編碼。如果使用函數(shù)式編程,就可以避免這些問(wèn)題。此外,可以利用函數(shù)式編程風(fēng)格編寫更加優(yōu)美的回調(diào)。
    2008-05-05
  • JS實(shí)現(xiàn)頁(yè)面滾動(dòng)到關(guān)閉時(shí)的位置與不滾動(dòng)效果

    JS實(shí)現(xiàn)頁(yè)面滾動(dòng)到關(guān)閉時(shí)的位置與不滾動(dòng)效果

    這篇文章主要介紹了JS實(shí)現(xiàn)頁(yè)面滾動(dòng)到關(guān)閉時(shí)的位置與不滾動(dòng)效果,滾動(dòng)有兩種方案,其一,利用路由中的meta,在離開(kāi)頁(yè)面時(shí)緩存 top 信息,其二,利用keep-alive緩存整個(gè)頁(yè)面。但是僅限于沒(méi)有實(shí)時(shí)數(shù)據(jù)變動(dòng)的頁(yè)面,需要的朋友可以參考下本文
    2022-06-06
  • IntersectionObserver API 詳解篇

    IntersectionObserver API 詳解篇

    這篇文章主要介紹了IntersectionObserver API 詳解篇,需要的朋友可以參考下
    2016-12-12
  • 新浪微博字?jǐn)?shù)統(tǒng)計(jì) textarea字?jǐn)?shù)統(tǒng)計(jì)實(shí)現(xiàn)代碼

    新浪微博字?jǐn)?shù)統(tǒng)計(jì) textarea字?jǐn)?shù)統(tǒng)計(jì)實(shí)現(xiàn)代碼

    從新浪微博代碼里抄的,非常不錯(cuò),需要的朋友可以參考下。
    2011-08-08
  • 使用js實(shí)現(xiàn)雪花飄落效果

    使用js實(shí)現(xiàn)雪花飄落效果

    以下是對(duì)使用js實(shí)現(xiàn)雪花飄落的效果進(jìn)行了介紹。需要的朋友可以 過(guò)來(lái)參考下
    2013-08-08
  • 原生JS封裝vue Tab切換效果

    原生JS封裝vue Tab切換效果

    這篇文章主要為大家詳細(xì)介紹了原生JS封裝vue Tab切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評(píng)論