摘要:如果該參數(shù)的值為或,則表示不需要傳入任何參數(shù),從開(kāi)始可以使用類(lèi)數(shù)組對(duì)象。當(dāng)使用操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無(wú)效。當(dāng)綁定函數(shù)被調(diào)用時(shí),這些參數(shù)將置于實(shí)參之前傳遞給被綁定的方法。
在了解call,apply之前需要先了解下javascrit中this指向
this的指向
在ES5里面,this永遠(yuǎn)指向最后調(diào)用它的那個(gè)對(duì)象
舉個(gè)栗子:
var name = "outerName"; function test(){ var name = "innerName"; console.log(this.name); //outerName console.log("inner:" + this); //inner:Window } test(); console.log("outer:"+this);//outer:Window
我們最后調(diào)用test的地方test();,前面沒(méi)有調(diào)用的對(duì)象那么就是全局對(duì)象window,相當(dāng)于window.test();注意這里沒(méi)有使用嚴(yán)格模式,如果使用嚴(yán)格模式,全局對(duì)象就是undefined,那么就會(huì)報(bào)錯(cuò)Uncaught TypeError:cannot read property "name" of underfined
在舉個(gè)栗子:
var name = "outerName"; var test = { name:"innerName", fn:function(){ console.log(this.name); //innerName } }; test.fn(); window.test.fn();
這里打出的是innerName,因?yàn)閒n是test調(diào)用的
還有個(gè)略坑的栗子:
var name = "outerName"; var test = { name:null, fn:function(){ console.log(this.name); //outerName } }; var f = test.fn f();
這里打出的outerName因?yàn)閒并沒(méi)有被調(diào)用,fn()仍然是window調(diào)用的
再看看這個(gè)栗子:
var name = "outerName"; function fn(){ var name = "innnerName"; innerFn(); function innerFn(){ console.log(this.name); //outerName } }; fn();
這里打出的是outerName,因?yàn)槿匀皇莣indow調(diào)用的
總結(jié)一下:
this的指向并不是在創(chuàng)建的時(shí)候就可以確定的,在ES5里面,this永遠(yuǎn)是指向最后調(diào)用它的那個(gè)對(duì)象。
改變this指向
那我們?cè)趺床拍芨淖僼his指向呢,總結(jié)一下
使用ES6的箭頭函數(shù)
在函數(shù)內(nèi)部使用_this=this;
使用call、apply、bind
new 實(shí)例化一個(gè)對(duì)象
繼續(xù)看一個(gè)栗子:
var name = "outerName"; var test = { name:"mm", fn1:function(){ console.log(this.name); }, fn2:function(){ setTimeout(function(){ this.fn1(); },0); } }; test.fn2(); //this.fn1 is not a funtion
箭頭函數(shù)
ES6中的箭頭函數(shù)是可以避免ES5中的this的坑的,箭頭函數(shù)始終指向定義時(shí)的this,而非執(zhí)行時(shí)。
箭頭函數(shù)中沒(méi)有this綁定,必須通過(guò)查找作用域鏈來(lái)覺(jué)得其值,如果箭頭函數(shù)被非箭頭函數(shù)包含,那么this綁定的是最近一層非箭頭函數(shù)的this,否則,this為undefined.
調(diào)整后的栗子:
var name = "outerName"; var test = { name:"mm", fn1:function(){ console.log(this.name); }, fn2:function(){ setTimeout(() => { this.fn1(); },0); } }; test.fn2(); //mm
在函數(shù)內(nèi)部使用_this = this
_this指的是test對(duì)象
var name = "outerName"; var test = { name:"mm", fn1:function(){ console.log(this.name); }, fn2:function(){ var _this = this; setTimeout(function(){ _this.fn1(); },0); } }; test.fn2(); //mm
使用call,apply,bind
var name = "outerName"; var test = { name:"mm", fn1:function(){ console.log(this.name); }, fn2:function(){ setTimeout(function(){ this.fn1(); }.apply(test),0); } }; test.fn2(); //mm
var name = "outerName"; var test = { name:"mm", fn1:function(){ console.log(this.name); }, fn2:function(){ setTimeout(function(){ this.fn1(); }.call(test),0); } }; test.fn2(); //mm
var name = "outerName"; var test = { name:"mm", fn1:function(){ console.log(this.name); }, fn2:function(){ setTimeout(function(){ this.fn1(); }.bind(test)(),0); } }; test.fn2(); //mm
具體有什么區(qū)別呢
看下MDN上的解釋
apply
語(yǔ)法:
fun.apply(thisArg,[argsArray]);
參數(shù)
thisArg
在fun函數(shù)運(yùn)行時(shí)指定的this值,需要注意的是,指定的this的值不一定是該函數(shù)執(zhí)行時(shí)真正的this值,如果這個(gè)函數(shù)處于非嚴(yán)格模式下,則指定為null或undefined時(shí)會(huì)自動(dòng)指向全局對(duì)象(瀏覽器中就是window對(duì)象),同時(shí)值為原始值(數(shù)字,字符串,布爾值)的this會(huì)指向該原始值的自動(dòng)包裝對(duì)象。
argsArray
一個(gè)數(shù)組或者類(lèi)數(shù)組對(duì)象,其中數(shù)組原始將作為多帶帶的參數(shù)傳給fun函數(shù)。如果該參數(shù)的值為null或undefined,則表示不需要傳入任何參數(shù),從ECMAScript5開(kāi)始可以使用類(lèi)數(shù)組對(duì)象。
call
語(yǔ)法
fun.call(thisArg,arg1,arg2,...)
參數(shù)
thisArg
同上apply
arg1,agr2,...
指定的參數(shù)列表
bind
語(yǔ)法
fun.bind(thisArg[,arg1[,arg2[,...]]])
參數(shù)
thisArg
當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的this指向。當(dāng)使用new操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無(wú)效。
arg1,arg2,...
當(dāng)綁定函數(shù)被調(diào)用時(shí),這些參數(shù)將置于實(shí)參之前傳遞給被綁定的方法。
在總結(jié)一下:
apply,call,bind都是用來(lái)改變函數(shù)的this對(duì)象的指向;
第一個(gè)參數(shù)都是this要指向的對(duì)象,也就是指定的上下文;
都可以利用后續(xù)參數(shù)傳參;
apply,call是立即調(diào)用,bind是返回對(duì)應(yīng)函數(shù),需要手動(dòng)調(diào)用。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92250.html
摘要:回調(diào)函數(shù)中調(diào)用在回調(diào)函數(shù)中一般有兩種情況回調(diào)函數(shù)為匿名函數(shù)時(shí),回調(diào)函數(shù)的會(huì)指向,需要對(duì)回調(diào)函數(shù)。回調(diào)函數(shù)為箭頭函數(shù)時(shí),回調(diào)函數(shù)的會(huì)指向他的直接上層。 淺談-this this簡(jiǎn)單而又神秘,使用場(chǎng)景多變而又復(fù)雜,這造就了它成為了初級(jí)javascript開(kāi)發(fā)人員不愿接觸的東西,高級(jí)javascript都想探究的東西。文本亦是對(duì)this的致敬。 this是什么? this是當(dāng)前執(zhí)行環(huán)境...
摘要:函數(shù)調(diào)用方法一般我們是這樣調(diào)用函數(shù)的和現(xiàn)在我們說(shuō)一說(shuō)方法和方法。他們都是調(diào)用一個(gè)對(duì)象的方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。例如方法在上面的例子中,,意思就是用來(lái)替換。和方法比較類(lèi)似,其作用都是改變上下文的。 call(), apply(), bind() 函數(shù)調(diào)用方法 一般我們是這樣調(diào)用函數(shù)的: function add(x){ console.log(x) } add(2)//2...
摘要:綁定使用方式進(jìn)行調(diào)用函數(shù)時(shí),會(huì)發(fā)生構(gòu)造函數(shù)的調(diào)用。先上圖,然后根據(jù)文字閱讀使用調(diào)用函數(shù)之后,該函數(shù)才作為構(gòu)造函數(shù)進(jìn)行調(diào)用,構(gòu)造一個(gè)全新的對(duì)象賦值給,而對(duì)象的指向了的對(duì)象,的對(duì)象有一個(gè)屬性指向的構(gòu)造函數(shù)這個(gè)就是的原型鏈,也是的特性。 javascript語(yǔ)言是在運(yùn)行時(shí)前即進(jìn)行編譯的,而this的綁定也是在運(yùn)行時(shí)進(jìn)行綁定的。也就是說(shuō),this實(shí)際上是在函數(shù)被調(diào)用時(shí)候發(fā)生綁定的,它指向什么完...
摘要:文章盡量使用大量實(shí)例進(jìn)行講解,它們的使用場(chǎng)景。在嚴(yán)格模式下,函數(shù)被調(diào)用后,里面的默認(rèn)是后面通過(guò)調(diào)用函數(shù)上的和方法,該變指向,函數(shù)里面的指向。利用,可以傳入外層的上下文。同樣適用的還有,里面的對(duì)象,它也是一種類(lèi)數(shù)組對(duì)象。 call,apply and bind in JavaScript 在ECMAScript中,每個(gè)函數(shù)都包含兩個(gè)繼承而來(lái)的方法:apply() 和 call(),這兩個(gè)...
摘要:當(dāng)多個(gè)事件觸發(fā)的時(shí)候,會(huì)把異步事件依次的放入里等同步事件執(zhí)行完之后,再去隊(duì)列里一個(gè)個(gè)執(zhí)行拾遺常用方法總結(jié)面試的信心來(lái)源于過(guò)硬的基礎(chǔ)參考高級(jí)程序設(shè)計(jì)你所不知道的深入淺出知識(shí)點(diǎn)思維導(dǎo)圖經(jīng)典實(shí)例總結(jié)那些剪不斷理還亂的關(guān)系 持續(xù)不斷更新。。。 基本類(lèi)型和引用類(lèi)型 vue props | Primitive vs Reference Types 基本類(lèi)型和字面值之間的區(qū)別 基本類(lèi)型和字面值相等,...
閱讀 1836·2021-11-24 09:39
閱讀 2304·2021-09-30 09:47
閱讀 4173·2021-09-22 15:57
閱讀 1893·2019-08-29 18:36
閱讀 3591·2019-08-29 12:21
閱讀 604·2019-08-29 12:17
閱讀 1277·2019-08-29 11:25
閱讀 738·2019-08-28 18:26