谁调用它,this 就指向谁。
但是有时候这样的判断并不准确,可以按照如下规则进行判断。
全局环境中的this
浏览器环境:无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象 window
node 环境:无论是否在严格模式下,在全局执行环境中(在任何函数体外部),this 都是空对象 {}
是否是new绑定
如果是 new
绑定并且
构造函数返回值是 function 或 object,
new foo()
返回的是foo中返回的对象。
<script>
function foo(age){
this.age = age;
var obj = {a:'1'};
return obj;
}
let info = new foo('23');
console.log(info); //{a:'1'}
console.log(info.age); //undefined
</script>
显示绑定
函数是否通过call,apply调用,或者使用bind绑定,如果是,那么this绑定的就是指定的对象
<script>
function foo(){
console.log(this.num);
}
var animal = {
num:20,
foo
}
var num = 23;
var foo = animal.foo;
foo.call(animal); //20
foo.apply(animal); //20
foo.bind(animal)(); //20
</script>
隐式绑定
函数的调用是在某个对象上触发的,即调用位置上存在上下文对象,那么this指向的就是调用该函数的对象
<script>
function info (){
console.log(this.age);
}
var person = {
age:20,
info
}
var age = 23;
person.info(); //20;隐式绑定
</script>
箭头函数
箭头函数没有自己的this,继承外层上下文绑定的this
<script>
var obj = {
age:23,
info:function(){
return ()=>{
console.log(this.age);
}
}
}
var person = {age:'20'};
var info = obj.info();
info(); //23
var info2 = obj.info.call(person);
info2(); //20
</script>