Javascript的绑定实现?

前端之家收集整理的这篇文章主要介绍了Javascript的绑定实现?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
因为bind不是一个跨浏览器(旧的)功能,所以它有一个polyfill:(来自John Resig的书)
/*1*/       Function.prototype.bind = function ()
/*2*/       {
/*3*/           var fn = this,/*4*/               args = Array.prototype.slice.call(arguments),/*5*/               object = args.shift();
/*6*/           return function ()
/*7*/           {
/*8*/               return fn.apply(object,/*9*/                   args.concat(Array.prototype.slice.call(arguments)));
/*10*/           };
/*11*/       };

但是我不明白为什么我们需要#9行的参数.

我的意思是 :

如果我有这个对象:

var foo = {
    x: 3
}

我有这个功能

var bar = function(p,b){

    console.log(this.x+'        '+p+'   '+b);
}

所以,如果我想要bar在foo上下文中运行,使用参数 – 所有我需要做的是:

var boundFunc = bar.bind(foo,1,2)
 boundFunc ()...

所以当我运行var.bind(foo,2)时,参数是[object Object],2.

这些参数保存在第4行.

大.

现在,bind函数返回自己的关闭函数

function ()
    {
        return fn.apply(object,args.concat(Array.prototype.slice.call(arguments)));
    }

为什么我们需要论证?它似乎是为了像这样的东西:

var boundFunc = bar.bind(foo,2)
boundFunc (more1,more2....) //<----- ??

我错过了什么吗?

Oonce我设置了第一个var boundFunc = bar.bind(foo,2),我已经声明了参数.为什么我们需要两次?

解决方法

有两个地方可以将参数传递给绑定函数

1)当你调用bind(第一个参数)时.这些被调用时总是应用于绑定函数.

2)当你调用绑定函数(第二个参数)时.这些是你提到的“more1,more2”.这些变化取决于调用绑定参数时提供的内容.

第9行将原始绑定参数与提供的额外参数组合.

我猜你可能会困惑的概念是你最初不必绑定所有的参数 – 你只能绑定上下文对象,或者你也可以绑定第一个参数,但是绑定函数调用者提供其余的.例如:

function sum() {
 var _sum = 0
 for (var i = 0; i < arguments.length ; i++) {
     _sum += arguments[i];
 }
 return _sum;
}
var sum_plus_two = sum.bind({},2);
sum_plus_two(5,7) == 14;

猜你在找的JavaScript相关文章