js中call和apply的作用和用法
call和apply的用途是完全一樣的。改變函數(shù)中this的指向:
為什么要改變this的指向呢?這個(gè)有什么用?有哪些場(chǎng)景呢?
首先this的指向總是在變的,this的指向是由函數(shù)執(zhí)行時(shí)所在的環(huán)境決定的,而不是函數(shù)聲明時(shí)的環(huán)境。
this都指向哪里?
1、在控制臺(tái)中輸入下面的代碼,此時(shí)可以看到this指向a這個(gè)對(duì)象。
var a={name:'a',getName:function(){return this.name;} } console.info(a.getName());//a?
2、此時(shí)this指向了window
window.name= 'window'; var a={name:'a',getName:function(){return this.name;} }var b = a.getName; console.info(b());//window結(jié)論:
如果函數(shù)是作為一個(gè)對(duì)象的屬性被調(diào)用的(用點(diǎn)的方式調(diào)用),此時(shí)函數(shù)內(nèi)的this就指向這個(gè)對(duì)象。
如果是用變量或者名稱(chēng)的方式直接調(diào)用的(不是使用點(diǎn)調(diào)用),則指向window。
?
場(chǎng)景:
this的改變:在寫(xiě)代碼時(shí)經(jīng)常會(huì)遇到這種情況,將函數(shù)作為回調(diào)函數(shù)使用時(shí),this的指向變?yōu)榱藈indow,這個(gè)不是我們預(yù)期的結(jié)果
window.name='window'; var a={name:'a',getName:function(callback){return callback();//funcB使用非對(duì)象.的方式調(diào)用},funcB:function(){return this.name;} } console.info(a.getName(a.funcB));//window這個(gè)時(shí)候就可以用call或者apply把this傳遞到callback中,callback中的this的指向就會(huì)被傳入的this所替代。
當(dāng)然,也可以傳入其他對(duì)象覆蓋當(dāng)前this的指向。
window.name='window'; var b={name:'b' }; var a={name:'a',getName:function(callback){return callback.call(b);//傳入b },funcB:function(){return this.name;} } console.info(a.getName(a.funcB));//b也可以借用這個(gè)對(duì)象的方法。
window.name='window'; var b={name:'b', getBName:function(){return this.name;} }; var a={name:'a',getName:function(callback){return callback.call(b);//傳入b },funcB:function(){return this.getBName();} } console.info(a.getName(a.funcB));//b使用這個(gè)功能可以實(shí)現(xiàn)類(lèi)似繼承的效果
var F=function(name){this.name = name; } var S = function(){this.age=arguments[1];F.apply(this,arguments); } S.prototype.getNameAndAge=function(){console.info('名字是'+this.name+'年齡是'+this.age); }var s = new S('小紅','9歲'); s.getNameAndAge();//名字是小紅年齡是9歲?
call和apply的區(qū)別:
傳入的參數(shù)形式不一樣
call(obj,參數(shù)1,參數(shù)2);
apply(obj,[參數(shù)1,參數(shù)2]);
轉(zhuǎn)載于:https://www.cnblogs.com/panyujun/p/9367911.html
總結(jié)
以上是生活随笔為你收集整理的js中call和apply的作用和用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓手机怎么下载历史版本的软件?
- 下一篇: Codeforces.666E.Fore