1.this的默认绑定优先级是最低的。
function foo() {
console.log(this);
}
foo()//window
2.this的隐式绑定的优先级是高于默认绑定的。
var obj = {
naem: 'why',
eating: fn
}
obj.eating();// obj
3.this的显示绑定优先级高于隐式绑定。
var obj = {
name: 'obj',
foo: function () {
console.log(this);
}
}
obj.foo()//windwo
// 1.apply / call的显示绑定高于隐式绑定
obj.foo.apply('abc')//abc
obj.foo.call('abc')//abc
// 2.bind的优先级高于隐式绑定
// var bar = obj.foo.bind('abc');
// bar();//这相当于独立函数调用=>abc
// 3.更明显的比较
function foo() {
console.log(this);
}
var obj = {
name: 'obj',
foo: foo.bind('aaa')
}
// 这时候的绑定才是真正的公平的 既调到了obj又调到了bind
obj.foo();//foo
4.new高于隐式绑定
var obj = {
name: 'obj',
foo: function () {
console.log(this);
}
}
var f = new obj.foo();//foo
5.new高于显示绑定
new关键字不能和apply/call一起使用, 因为call/apply和new都是主动去调用一个函数的,所以是很难放到一起使用的
所以我们只能比较new和bind之间谁的优先级更高
function foo() {
console.log(this);
}
var bar = foo.bind('aaaa');
var obj = new bar(); //foo
总结:new绑定 => 显示绑定(apply / call / bind) => 隐式调用(obj.foo()) => 独立函数调用
6.优先级-忽略显示绑定
function foo() {
console.log(this);
}
foo.apply('abc');
foo.apply({
})
// apply/call/bind:当传入null/undefined时,自动将this绑定成全局对象
foo.apply(null)//window
foo.call(null)//window
var bar = foo.bind(null)
bar();//window
7.特殊绑定-间接函数引用
// 争论:代码规范 ;
var obj1 = {
name: 'obj1',
foo: function () {
console.log(this);
}
}
var obj2 = {
name: 'obj2'
};
// obj2.bar = obj1.foo;
// obj2.bar();
// 会在词法分析的时候 把上面的obj2和函数调用看成是一个整体
// 第一个小括号是把表达式当成一个整体括起来
(obj2.bar = obj1.foo)();