call,apply 的模擬實(shí)現(xiàn)

1、call的模擬實(shí)現(xiàn)

  • 完成了 this 的綁定
  • 完成了參數(shù)的傳遞
  • 若傳入的是 null ,則綁定 this 為 window
  • 有返回值
  • 模擬的是非嚴(yán)格模式下的

Function.prototype.call2 = function(context){
    context = context || window
    context.fn = this;
    var arr=[];
    for(var i=1;i<arguments.length;i++){
        arr.push(arguments[i]);
    }
    var result = context.fn(...arr);
    delete context.fn;
    return result;
}
var value = 3;
var foo = {
    value:2
}
function bar (a,b){
    console.log(a,b,this.value)
    return {
        'a':a,
        'b':b,
        'value':this.value
    }
}
bar.call2(null,"aa","bb");
console.log(bar.call2(foo,"aa","bb"))
  • 使用擴(kuò)展運(yùn)算符... 即 var result = context.fn(...arr);
  • 擴(kuò)展運(yùn)算符是 ES6 中才有的,es5 中使用 var result = eval('context.fn(' + args +')');會(huì)把 args 數(shù)組解析開
  • 了解eval() 函數(shù),該函數(shù)就是用JavaScript的解析引擎來解析傳入字符串里面的內(nèi)容

apply 模擬實(shí)現(xiàn)

  • 模擬的是嚴(yán)格模式下的
Function.prototype.apply = function (context, arr) {
    var context = Object(context) || window;
    context.fn = this;
    var result;
    if (!arr) {
        result = context.fn();
    }
    else {
        var args = [];
        for (var i = 0, len = arr.length; i < len; i++) {
            args.push('arr[' + i + ']');
        }
        result = eval('context.fn(' + args + ')')
    }
    delete context.fn
    return result;
}
  • 中間把 arr 的值 push 到 args 里是因?yàn)椋琣rguments 是一個(gè)類數(shù)組,直接使用 arr 的話,傳遞的是一個(gè)對(duì)象

嚴(yán)格模式和非嚴(yán)格模式的區(qū)別

  • 在非嚴(yán)格模式下,null 和 undefined 會(huì)指向 window ,而在嚴(yán)格模式下,指向 undefined
  • 直接調(diào)用函數(shù)的時(shí)候 fn() 非嚴(yán)格模式下,this 指向 window ,嚴(yán)格模式下指向 undefined (見this指向的筆記
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容