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 this和1as 调用f a.
我认为g是围绕f的包装函数.
但是,当我这样做
var f = function (a) { ... }
var g = f.bind(obj);
g.call(1)
Run Code Online (Sandbox Code Playgroud)
然后使用1as this和aundefined 调用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 this和aundefined 调用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)
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
21947 次 |
| 最近记录: |