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

2023-12-07

我尝试整理一下关于 javascript 的 bind() 工作原理的想法。

我看到如果我这样做

var f = function (a) { ... }
var g = f.bind(obj);
g(1)

然后 f 被调用obj as this and 1 as a.

我认为 g 是 f 的包装函数。

但当我这样做时

var f = function (a) { ... }
var g = f.bind(obj);
g.call(1)

然后 f 被调用1 as this and a不明确的。

所以看来 g 不仅仅是一个简单的包装器,而是call以某种方式区分正常函数和绑定函数。

另一件事是我不能多次部分应用某个函数。

var f = function (a) { ... }
var g = f.bind(obj);
var h = g.bind(1);
h();

然后 f 被调用obj as this and a不明确的。

这种行为的原因是什么?

Edit

这个问题中的结构实际上是错误的,请参阅已接受的答案,了解它们应该是什么样子(一般来说,我没有注意到call and bind总是需要上下文参数作为第一个参数)。


一旦你将一个对象绑定到一个函数bind,你不能覆盖它。它在规格中写得很清楚,正如您所见MDN 文档:

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

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

g.call(1);

你会得到obj as 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());

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

为了避免混淆,第一个参数call是上下文对象(this),那么你就会得到剩下的论证。

它的意思是:

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

obj.foo('hello');

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

foo.call(obj, 'hello');

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Javascript 中绑定已绑定函数的更多参数 的相关文章