我尝试整理一下关于 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(使用前将#替换为@)