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

資訊專(zhuān)欄INFORMATION COLUMN

淺談javascript里面的this、call、apply、bind

Lemon_95 / 3549人閱讀

摘要:如果該參數(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

相關(guān)文章

  • 淺談-this

    摘要:回調(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)境...

    archieyang 評(píng)論0 收藏0
  • 淺談call()、apply()、bind()方法

    摘要:函數(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...

    zhangrxiang 評(píng)論0 收藏0
  • 淺談 javascriptthis綁定問(wèn)題

    摘要:綁定使用方式進(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ā)生綁定的,它指向什么完...

    duan199226 評(píng)論0 收藏0
  • call,apply and bind in JavaScript

    摘要:文章盡量使用大量實(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è)...

    JohnLui 評(píng)論0 收藏0
  • js基礎(chǔ)深入淺出

    摘要:當(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)型和字面值相等,...

    phodal 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<