成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript中call(),apply().bind()方法的作用和異同

Near_Li / 3457人閱讀

摘要:原文章發(fā)表在的個(gè)人博客一細(xì)節(jié)中函數(shù)存在定義時(shí)上下文,運(yùn)行時(shí)上下文上下文是可變的為改變某個(gè)函數(shù)運(yùn)行時(shí)的上下文而存在的,換句話說,是為了改變函數(shù)內(nèi)部的指向沒有方法,但是有呀所以可以去把方法的運(yùn)行時(shí)上下文也就是運(yùn)行時(shí)的的指向,指向這個(gè)時(shí)候低啊用

原文章發(fā)表在 Klay-Clam的個(gè)人博客

一、細(xì)節(jié)

javascript 中函數(shù)存在“定義時(shí)上下文”,“運(yùn)行時(shí)上下文”

上下文是可變的

1. call()

call(),為改變某個(gè)函數(shù)運(yùn)行時(shí)的上下文(context)而存在的,換句話說,是為了改變函數(shù)內(nèi)部的this指向.

// demo1
var sayKlay = {
    name :"Klay",
    say : function(){
        console.log(this.name);
    }
}
var sayClam = {
    name : "Clam" 
}
/* 
sayClam()沒有say方法,但是sayKlay()有呀
所以可以去把sayKlay.say()方法的運(yùn)行時(shí)上下文
也就是運(yùn)行時(shí)的this的指向,指向sayClam()
這個(gè)時(shí)候低啊用say()方法就可以sayClam了。
*/
sayKlay.say.call(sayClam); // Clam

// demo2
function a(xx) {         
    this.b = xx; 
} 
var o = {}; 
a.call(o, 5); 
console.log(a.b);    // undefined 
console.log(o.b);    // 5 

參考:MDN call()方法

2.apply()

apply()call()作用沒有區(qū)別,用法與call()方法稍有區(qū)別,就是call()的第二個(gè)參數(shù)(調(diào)用函數(shù)使用的參數(shù)),是一個(gè)一個(gè)傳入的;

而apply()的第二個(gè)參數(shù)的值是使用數(shù)組的形式傳入的

function add(a,b) {         
    this.sum = a + b; 
} 
var o = {}; 
add.call(o, 5,5);
console.log(o.sum);    // 10
add.apply(o,[3,5]);
console.log(o.sum);    // 8

參考 MDN apply()方法

3.bind()

bind()的作用其實(shí)與call()以及apply()都是一樣的,都是為了改變函數(shù)運(yùn)行時(shí)的上下文,bind()與后面兩者的區(qū)別是,call()和apply()在調(diào)用函數(shù)之后會(huì)立即執(zhí)行,而bind()方法調(diào)用并改變函數(shù)運(yùn)行時(shí)的上下文的之后,返回一個(gè)新的函數(shù),在我們需要調(diào)用的地方去調(diào)用他。

// bind()方法并不會(huì)直接調(diào)用,只是改變了函數(shù)的上下文,并成為一個(gè)副本
var button = document.getElementById("button"),
    text = document.getElementById("text");
button.onclick = function() {
    alert(this.id); // 彈出text
}.bind(text);
// ie6-ie8不支持bind()方法,所以要用下面的方法去模擬bind()
if (!function() {}.bind) {
    Function.prototype.bind = function(context) {
        var self = this
            , args = Array.prototype.slice.call(arguments);
            
        return function() {
            return self.apply(context, args.slice(1));    
        }
    };
}

參考MDN bind()方法

二、總結(jié)

利用上面的call(),apply()bind()方法,可以在代碼復(fù)用減少代碼的冗余上面有很大的幫助,以前編碼的過程中,的確是沒有很好的利用,希望在今后的編碼的過程中自己可以努力的去嘗試,去試錯(cuò)。

enjoy~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/89095.html

相關(guān)文章

  • 可能遇到假面試題:不用callapply方法模擬實(shí)現(xiàn)ES5bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個(gè)列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個(gè)人博客:前端小密圈,評(píng)論交流送1024邀請(qǐng)碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    李世贊 評(píng)論0 收藏0
  • 可能遇到假面試題:不用callapply方法模擬實(shí)現(xiàn)ES5bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個(gè)列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個(gè)人博客:前端小密圈,評(píng)論交流送1024邀請(qǐng)碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    ConardLi 評(píng)論0 收藏0
  • JScallapply、bind方法詳解

    摘要:不能應(yīng)用下的等方法。首先我們可以通過給目標(biāo)函數(shù)指定作用域來簡單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無效的。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

    zombieda 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--call、apply、bind方法詳解

    摘要:首先我們可以通過給目標(biāo)函數(shù)指定作用域來簡單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無效的。而則會(huì)立即執(zhí)行函數(shù)。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

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

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

0條評(píng)論

閱讀需要支付1元查看
<