在Javascript中绑定更多已绑定函数的参数

Mar*_*cka 28 javascript bind call

我试着对javascript的bind()如何工作进行排序.

如果我这样做,我会看到

var f = function (a) { ... }
var g = f.bind(obj);
g(1)
Run Code Online (Sandbox Code Playgroud)

然后用objas as this1as 调用f a.

我认为g是围绕f的包装函数.

但是,当我这样做

var f = function (a) { ... }
var g = f.bind(obj);
g.call(1)
Run Code Online (Sandbox Code Playgroud)

然后使用1as thisaundefined 调用f .

因此,似乎g不仅仅是一个简单的包装器,而且call以某种方式区分正常和绑定函数.

还有一件事是我不能多次部分应用一个函数.

var f = function (a) { ... }
var g = f.bind(obj);
var h = g.bind(1);
h();
Run Code Online (Sandbox Code Playgroud)

然后使用objas thisaundefined 调用f .

这种行为的原因是什么?

编辑

这个问题中的结构实际上是错误的,看看他们看起来应该接受的答案(通常我没有注意到这一点,call并且bind总是需要将context参数作为第一个参数).

ZER*_*ER0 47

将对象绑定到函数后bind,就无法覆盖它.正如你在MDN文档中看到的那样,它清楚地写在规范中:

"bind()函数创建一个新函数(一个绑定函数),它具有相同的函数体(ECMAScript 5术语中的内部调用属性)作为调用它的函数(绑定函数的目标函数),并将此值绑定到bind()的第一个参数,它不能被覆盖. "

这意味着,如果你这样做:

g.call(1);
Run Code Online (Sandbox Code Playgroud)

您将获得objas this,而不是1- 遵循规范的浏览器.

你当然可以绑定多个参数,所以:

var sum = function(a, b, c) { return a + b + c };
var sumAB = sum.bind(null, 1, 5);
var sumC = sumAB.bind(null, 2);

console.log(sumC());
Run Code Online (Sandbox Code Playgroud)

但是上下文对象将始终是第一个指定的对象bind,因为它不能被覆盖.

为了避免混淆,调用的第一个参数是context object(this),那么你将拥有其余的参数.

它的意思是:

var obj = { foo: function(bar) { console.log(bar) } };

obj.foo('hello');

// equivalent to:
var foo = obj.foo;

foo.call(obj, 'hello');
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • MDN中的文档已更改,您的报价不再存在 (2认同)