久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

JavaScript中call,apply,bind方法的總結

call和apply都是改變上下文中的this并立即執行這個函數,bind方法可以讓對應的函數想什么時候調就什么時候調用,并且可以將參數在執行的時候添加,這是它們的區別,根據自己的實際情

  why?call,apply,bind干什么的?為什么要學這個?

  一般用來指定this的環境,在沒有學之前,通常會有這些問題。

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user);
    }
}
var b = a.fn;
b(); //undefined

  我們是想打印對象a里面的user卻打印出來undefined是怎么回事呢?如果我們直接執行a.fn()是可以的。

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user);
    }
}
a.fn(); //追夢子

  這里能夠打印是因為,這里的this指向的是函數a,那為什么上面的不指向a?我們如果需要了解this的指向問題,請看徹底理解js中this的指向,不必硬背這篇文章。

  雖然這種方法可以達到我們的目的,但是有時候我們不得不將這個對象保存到另外的一個變量中,那么就可以通過以下方法。

  1、call()

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user); //追夢子
    }
}
var b = a.fn;
b.call(a);

  通過在call方法,給第一個參數添加要把b添加到哪個環境中,簡單來說,this就會指向那個對象。

  call方法除了第一個參數以外還可以添加多個參數,如下:

var a = {
    user:"追夢子",
    fn:function(e,ee){
        console.log(this.user); //追夢子
        console.log(e+ee); //3
    }
}
var b = a.fn;
b.call(a,1,2);

  2、apply()

  apply方法和call方法有些相似,它也可以改變this的指向

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user); //追夢子
    }
}
var b = a.fn;
b.apply(a);

  同樣apply也可以有多個參數,但是不同的是,第二個參數必須是一個數組,如下:

var a = {
    user:"追夢子",
    fn:function(e,ee){
        console.log(this.user); //追夢子
        console.log(e+ee); //11
    }
}
var b = a.fn;
b.apply(a,[10,1]);

  或者

var a = {
    user:"追夢子",
    fn:function(e,ee){
        console.log(this.user); //追夢子
        console.log(e+ee); //520
    }
}
var b = a.fn;
var arr = [500,20];
b.apply(a,arr);

  //注意如果call和apply的第一個參數寫的是null,那么this指向的是window對象

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this); //Window {external: Object, chrome: Object, document: document, a: Object, speechSynthesis: SpeechSynthesis…}
    }
}
var b = a.fn;
b.apply(null);

  3、bind()

  bind方法和call、apply方法有些不同,但是不管怎么說它們都可以用來改變this的指向。

  先來說說它們的不同吧。

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user);
    }
}
var b = a.fn;
b.bind(a);

  我們發現代碼沒有被打印,對,這就是bind和call、apply方法的不同,實際上bind方法返回的是一個修改過后的函數。

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user);
    }
}
var b = a.fn;
var c = b.bind(a);
console.log(c); //function() { [native code] }

  那么我們現在執行一下函數c看看,能不能打印出對象a里面的user

var a = {
    user:"追夢子",
    fn:function(){
        console.log(this.user); //追夢子
    }
}
var b = a.fn;
var c = b.bind(a);
c();

  ok,同樣bind也可以有多個參數,并且參數可以執行的時候再次添加,但是要注意的是,參數是按照形參的順序進行的。

var a = {
    user:"追夢子",
    fn:function(e,d,f){
        console.log(this.user); //追夢子
        console.log(e,d,f); //10 1 2
    }
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);

  總結:call和apply都是改變上下文中的this并立即執行這個函數,bind方法可以讓對應的函數想什么時候調就什么時候調用,并且可以將參數在執行的時候添加,這是它們的區別,根據自己的實際情況來選擇使用。


來源:http://www.admin10000.com/document/7025.html

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

由于實際運行環境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發者能夠決定的,開發者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標簽、以及HTML5提供的對JavascriptAPI的擴展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應用的豐富,HTML5 工程師們已經不滿足于把桌面端體驗簡單移植到移動端,他們覬覦移動原生應用人性化的操作體驗,特別是原生應用與生俱來的豐富的手勢系統。HTML5 沒有提
你想要在自己網站上分享一個產品,或者是一個作品集,又或者僅僅只是一個靈感。在你發布到網上之前,你想讓它看起來有吸引力,專業,或者至少得看起來像那么回事。那么你接下
H5廣告,包括H5廣告的設計流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個講義。同時,也讓我意外的收到了非常好反饋和認!這是對我的極大鼓勵!我的
本文主要內容有:框架與組件、構建生態、開發技巧與調試、html、css與重構、native/hybrid/桌面開發、前端/H5優化、全棧/全端開發、研究實驗、數據分析與監控、其它軟技能、前端技術網
主站蜘蛛池模板: 亚洲欧美日韩精品久久亚洲区 | 欧美一区中文字幕 | 国产美女久久久 | 激情a| 国产精品欧美一区二区三区不卡 | 成人在线播放网站 | 天天爽夜夜操 | 天天操精品视频 | 国产精品精品视频 | 黄色在线免费看 | 欧美性jizz18性欧美 | 波多野结衣av中文字幕 | 成人亚洲| 亚洲精品久久久久久久不卡四虎 | 欧美黄色免费网站 | 中文字幕乱码亚洲精品一区 | 涩爱av一区二区三区 | 亚洲国产精品网站 | 日韩精品一区二区三区在线播放 | 日韩欧美一二三区 | 久久伊 | 五月婷婷 六月丁香 | 日韩aⅴ在线观看 | 亚洲国产网站 | 日韩欧美三级 | 中文字幕免费在线 | 99小视频 | 欧美精三区欧美精三区 | www.亚洲一区 | 91精品国产91久久久久久吃药 | av一区二区三区四区 | 欧美美女二区 | 欧美一级大片免费观看 | 在线观看日本高清二区 | 欧美一区二区三区电影 | 成人欧美一区二区三区在线观看 | 日韩精品一区在线 | 在线成人 | 91精品国产91久久综合桃花 | 日日夜夜免费精品 | 久草在线青青草 |