想知道JavaScript / Node.js中的优先级
如果我这样做:
var baz = {};
var bar = {};
var fn = function foo(){}.bind(baz);
fn.apply(bar, []);
总是会有baz的背景吗?有什么理由吗?
答案 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