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

資訊專欄INFORMATION COLUMN

JS系列之call & apply & bind

xiaochao / 1256人閱讀

摘要:參考鏈接在中,和是對象自帶的三個(gè)方法,都是為了改變函數(shù)體內(nèi)部的指向。返回值是函數(shù)方法不會立即執(zhí)行,而是返回一個(gè)改變了上下文后的函數(shù)。而原函數(shù)中的并沒有被改變,依舊指向全局對象。原因是,在中,多次是無效的。

參考鏈接:https://juejin.im/post/59bfe8...

在JavaScript中,call、apply和bind是Function對象自帶的三個(gè)方法,都是為了改變函數(shù)體內(nèi)部 this 的指向。

apply 、 call 、bind 三者第一個(gè)參數(shù)都是 this 要指向的對象,也就是想指定的上下文;

apply 、 call 、bind 三者都可以利用后續(xù)參數(shù)傳參;

bind 是返回對應(yīng) 函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用。

apply、call 的區(qū)別
func.apply(thisArg, [argsArray])
fun.call(thisArg, arg1, arg2, ...)

對于 apply、call 二者而言,作用完全一樣,只是接受參數(shù)的方式不太一樣。

var func = function(arg1, arg2) {
   ...   
};

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2]);

call 需要把參數(shù)按順序傳遞進(jìn)去,而 apply 則是把參數(shù)放在數(shù)組里。

bind
fun.bind(thisArg[, arg1[, arg2[, ...]]])

bind()方法會創(chuàng)建一個(gè)新函數(shù),稱為綁定函數(shù),當(dāng)調(diào)用這個(gè)綁定函數(shù)時(shí),綁定函數(shù)會以創(chuàng)建它時(shí)傳入 bind()方法的第一個(gè)參數(shù)作為 this,傳入 bind() 方法的第二個(gè)以及以后的參數(shù)加上綁定函數(shù)運(yùn)行時(shí)本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來調(diào)用原函數(shù)。
bind返回值是函數(shù)

var obj = {
    name: "Dot"
}

function printName() {
    console.log(this.name)
}

var dot = printName.bind(obj)
console.log(dot) // function () { … }
dot()  // Dot

bind 方法不會立即執(zhí)行,而是返回一個(gè)改變了上下文 this 后的函數(shù)。而原函數(shù) printName 中的 this 并沒有被改變,依舊指向全局對象 window。

有個(gè)有趣的問題,如果連續(xù) bind() 兩次,亦或者是連續(xù) bind() 三次那么輸出的值是什么呢?像這樣:

var bar = function(){
    console.log(this.x);
}
var foo = {
    x:3
}
var sed = {
    x:4
}
var func = bar.bind(foo).bind(sed);
func(); //?
  
var fiv = {
    x:5
}
var func = bar.bind(foo).bind(sed).bind(fiv);
func(); //?

答案是,兩次都仍將輸出 3 ,而非期待中的 4 和 5 。原因是,在Javascript中,多次 bind() 是無效的。更深層次的原因, bind() 的實(shí)現(xiàn),相當(dāng)于使用函數(shù)在內(nèi)部包了一個(gè) call / apply ,第二次 bind() 相當(dāng)于再包住第一次 bind() ,故第二次以后的 bind 是無法生效的。

參數(shù)
function fn(a, b, c) {
    console.log(a, b, c);
}
var fn1 = fn.bind(null, "Dot");

fn("A", "B", "C");            // A B C
fn1("A", "B", "C");           // Dot A B
fn1("B", "C");                // Dot B C
fn.call(null, "Dot");      // Dot undefined undefined

call 是把第二個(gè)及以后的參數(shù)作為 fn 方法的實(shí)參傳進(jìn)去,而 fn1 方法的實(shí)參實(shí)則是在 bind 中參數(shù)的基礎(chǔ)上再往后排。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99245.html

相關(guān)文章

  • call&apply&bindjs實(shí)現(xiàn)以及應(yīng)用

    摘要:實(shí)現(xiàn)使用是這樣轉(zhuǎn)換的生成新的函數(shù),新的執(zhí)行上下文通過在傳入對象中增加調(diào)用方法執(zhí)行被改變,得恢復(fù)原來的值實(shí)現(xiàn)在這里,我們看到了一個(gè)有趣的現(xiàn)象,在中可以傳入數(shù)組兩大作用改變借用其他對象的方法改變?nèi)绾螌?shí)現(xiàn)執(zhí)行借用其他對象的方法繼承的實(shí)現(xiàn)執(zhí)行能借用 js實(shí)現(xiàn)call // example let obj = { a: 124, b: ccc }; function fn(c) ...

    mgckid 評論0 收藏0
  • JS手寫bind處理new的情況詳解

      你有遇見過給bind返回的函數(shù)做new操作的場景,本篇主要講述的就是實(shí)現(xiàn)一下兼容new操作的bind寫法,順便學(xué)習(xí)一下new操作符,為大家提供下參考?! 〈蠹铱梢匀タ聪玛P(guān)于 JS 中 bind 方法的實(shí)現(xiàn)的文章,并給出了實(shí)現(xiàn):  Function.prototype.myBind=function(thisArg,...prefixArgs){   constfn=this;   return...

    3403771864 評論0 收藏0
  • apply&&call&&bind

    摘要:用來改變函數(shù)的對象的指向都是用來改變函數(shù)的對象的指向的。后面的參數(shù)是調(diào)用方法的參數(shù)。都可以利用后續(xù)參數(shù)傳參。 用來改變函數(shù)的this對象的指向 都是用來改變函數(shù)的this對象的指向的。 第一個(gè)參數(shù)都是this要指向的對象。 后面的參數(shù)是調(diào)用方法的參數(shù)。 都可以利用后續(xù)參數(shù)傳參。 var xw={ name: 小王, gender: 男, age: 24, ...

    whataa 評論0 收藏0
  • Hard binding & Soft binding detailed explanati

    摘要:硬綁定會大大降低函數(shù)的靈活性,使用硬綁定之后就無法使用像隱式綁定或顯示綁定來修改。如果可以給默認(rèn)綁定指定一個(gè)全局對象和意外的值,那就可以實(shí)現(xiàn)和硬綁定相同的效果,同時(shí)保留隱式綁定或顯示綁定修改的能力。 JavaScript中硬綁定與軟綁定詳解 JS中硬綁定這種方式可以把this強(qiáng)制綁定到指定的對象(除了使用new時(shí)),防止函數(shù)調(diào)用時(shí)應(yīng)用默認(rèn)綁定規(guī)則(非嚴(yán)格模式下全局對象-window| ...

    xiyang 評論0 收藏0
  • 《javascript高級程序設(shè)計(jì)》函數(shù)調(diào)用模式 & this深度理解

    在上一篇文章(《javascript高級程序設(shè)計(jì)》筆記:Function類型)中稍微提及了一下函數(shù)對象的屬性—this,在這篇文章中有深入的說明: 函數(shù)的三種簡單調(diào)用模式 1 函數(shù)模式 定義的函數(shù),如果單獨(dú)調(diào)用,不將其與任何對象關(guān)聯(lián),那么就是函數(shù)調(diào)用模式 function fn(num1, num2) { console.log(this); } // 直接在全局調(diào)用 fn();// w...

    wyk1184 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<