一.、概念
this是在运行时进行绑定的,不是在编写时进行绑定,取决于函数的调用方式
二、四条绑定规则
- 默认绑定
即独立函数调用,无法应用其他规则时使用此规则
function foo(){
"use strict"
console.log(this.a);
}
var a = 2;
foo() //严格模式下,this不指向window,否则指向window
- 隐式绑定
当函数引用有上下文对象时,隐式绑定会把this绑定到该上下文对象;
例如:
function foo(){
console.log(this.a);
}
var obj = {
a:42,
foo:foo
}
obj.foo()
注:对象属性引用链中只有最后一层影响调用位置
例如:
function foo(){
console.log(this.a);
}
var obj = {
a:2,
foo:foo
}
var obj1 = {
a:22,
obj:obj
}
obj1.obj.foo() //2
2_1:隐式绑定丢失
function foo(){
console.log(this.a);
}
var obj = {
a:2,
foo:foo
}
var bar = obj.foo;
var a = "oops"
bar() //osps
3.显式绑定
function foo(){
console.log(this.a)
}
var obj = {
a:2
}
var bar = function (){
foo.call(obj)
}
bar() //2
setTimeout(bar,100)//2
bar.call(window)//2
4.New操作符绑定
function Foo(){
this.name ="A"
}
var obj =new Foo()
console.log(obj.name);
三、绑定优先级
new操作符>显式>隐式>默认