誰調用它,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>