在将函数绑定到baz之后调用fn.apply(bar,[])

时间:2016-04-05 07:08:50

标签: javascript node.js

想知道JavaScript / Node.js中的优先级

如果我这样做:

var baz = {};
var bar = {};

var fn = function foo(){}.bind(baz);

fn.apply(bar, []);

总是会有baz的背景吗?有什么理由吗?

2 个答案:

答案 0 :(得分:2)

fn函数将始终将上下文设置为baz对象。它是以这种方式实现的,以确保在使用bind之后您没有上下文丢失。

来自bind()方法的MDN description

  

bind()函数用。创建一个新函数(一个绑定函数)   相同的函数体(ECMAScript 5术语中的内部调用属性)as   它被调用的函数(绑定函数的目标   函数)将此值绑定到bind()的第一个参数,   哪个无法覆盖

绑定函数可以接收另一个上下文时有一个例外:fn被调用为构造函数:var o = new fn()。在这种情况下,上下文将成为新的实例对象(但应避免这种情况并用于构造函数的正常函数)。

This chapter详细介绍了.bind()方法。

答案 1 :(得分:0)

为什么不测试

var baz = {a:1},
    bar = {a:2},
     fn = function(){console.log(this.a)}.bind(baz);

fn(); // 1
fn.apply(bar); // 1 so bind takes precedence
fn.call(bar); // 1 so bind takes precedence