this的指向不取决于它的位置,而在于它所在的function是如何被调用的。(以下this的优先级从高到低)
1.当this是在构造器调用时,this指向的是即将生成的对象。
function User (){
console.log(this);
}
let Bar = new User();
//此时this指向的就是Bar
2.当通过 call,apply,bind 显性绑定 this 的时候,this 指向绑定的值。
function foo() {
console.log(this.name);
}
obj = {
name: 'bar'
}
foo.call(obj); // bar
3.当this被作为方法调用的时候(对象中的函数),this的指向域为其父级函数。
let person = {
fname: '黑',
Lname: '土',
function full_name() {
return this.fname + this.Lname;
}
}
console.log(person.full_name()); // 黑土
此时this指向为person。
let person = {
fname: '黑',
lname: '土',
a: {
fname: '白',
lname: '云',
function full_name() {
return this.fname + this.lname;
}
}
}
console.log(person.a.full_name()); // 白云
此时this指向为a对象。
4.如果以上情况都不是,使用默认绑定规则,this指向域是最外层window,严格模式下值是undefined。如果 call、apply、bind 传入的第一个参数是 null/undefined , 执行默认绑定,但是这样有可能会带来Bug, 最好方法如下:
o = Object.create(null);
function bar() {}
bar.call(o, arguments);