强调点:
this在任何情况下都不指向函数的词法作用域;
this的指向是在函数调用时确定的而不是在函数声明时确定的
this绑定规则(优先级由低到高)
1、默认绑定
函数调用类型: 独立函数调用
function foo() {
console.log(this);
}
foo(); // global window...
2、隐式绑定
函数调用类型:obj.foo()
function foo() {
console.log(this);
}
var obj = {
foo: foo
}
obj.foo();
但是在隐式绑定中存在着隐式丢失绑定对象的情况
一种情况
function foo() {console.log(this);}
var obj = {foo: foo}
var bar = obj.foo // 函数别名
bar() //调用位置在全局作用域下,为默认绑定
另一种情况:函数作为参数传入时
function foo() {console.log(this);}
function doFoo(fn) {
// fn其实引用的是foo
fn(); // <--调用位置
}
var obj ={foo: foo}
doFoo(obj.foo);
3、显式绑定
call、apply、bind
4、new 绑定
var p = new Person();
var obj = {}; // 创建一个全新的对象
obj.__proto__ = Person.prototype; // 这个新对象会被执行[[prototype]]连接
Person.call(obj); // 这个新对象会绑定到函数的this
return obj; // 返回这个新对象
网友评论