gpt4 book ai didi

Javascript 的 Bind 实现?

转载 作者:可可西里 更新时间:2023-11-01 02:05:10 25 4
gpt4 key购买 nike

因为 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 行的arguments

我的意思是:

如果我有这个对象:

var foo = {
x: 3
}

我有这个功能:

var bar = function(p,b){

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

因此,如果我希望 barfoo 上下文中运行,带有参数 - 我需要做的就是:

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

所以当我运行 var.bind(foo,1,2) 时,arguments[object Object],1,2

这些参数保存在第 4 行。

很好。

现在,bind 函数返回它自己的闭包函数:

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

问题

为什么我们在这里需要参数?看起来它们是为了类似的东西:

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

我错过了什么吗?

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

最佳答案

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

1) 当你调用 bind 时(第一个 arguments)。这些总是在调用时应用于绑定(bind)函数。

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

第 9 行将原始绑定(bind)参数与提供的额外参数组合在一起。

我想您可能对这个概念感到困惑,即您不必一开始就绑定(bind)所有参数——您可以只绑定(bind)上下文对象,或者您也可以绑定(bind)第一个参数,但有绑定(bind)函数的调用者供应其余的。例如:

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 的 Bind 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22103354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com