规则优先级
默认绑定优先级最低
显示绑定优先级高于隐式绑定
var obj = {
name:"obj",
foo: function() {
console.log(this)
}
}
obj.foo() //obj
//call/apply优先级高于隐式绑定
obj.foo.call("abc") //abc
obj.foo.apply("abc") //abc
//bind优先级高于隐式绑定
var bar = obj.foo.bind("cba")
bar() //cba
//更明显的比较
function() {
console.log(this)
}
var obj = {
name:"obj",
foo:foo.bind("aaa")
}
obj.foo() //aaa
new高于隐式绑定
var obj = {
name:"obj",
foo:function() {
console.log(this)
}
}
var f = new obj.foo()
//foo{}
new高于显示绑定
//new关键字不能和appply/call一起使用
function foo() {
console.log(this)
}
var bar = foo.bind("aaa")
var obj = new bar()
//foo{}
bind高于call
忽略显示绑定
function foo() {
console.log(this)
}
foo.apply("abc")//abc
foo.apply({})//{}
//apply/call/bind: 当传入null/undefined时,自动将this绑定为全局对象
foo.apply(undefined)//window
foo.apply(null)//window
this规则之外-间接函数引用
var obj = {
name: "obj1",
foo: function() {
console.log(this)
}
}
var obj2 = {
name: "obj2"
}
//obj2.bar = obj1.foo
//obj2.bar() //obj2
//独立函数调用
(obj2.baz = obj1.foo)()//window