一道this指向题

JS中this的指向

选项(选择正确的一项):

A 在函数定义时,this指向全局变量
B 在浏览器下的全局范围内,this指向全局对象
C 当对象调用函数或者方法时,this指向这个对象
D 在使用new实例化对象时,this指向这个实例对象

选项有歧义,一眼看过去两三个选项都像对的,注意文字陷阱;A的全局变量名词错误;B的全局范围用词不准确,在任何函数体外部的全局范围?
知识点:

this指向的是,调用函数的那个对象。

分以下四种情况详细讨论this用法:


情况一:直接函数调用

非严格模式,this指向全局对象

1
2
3
4
function test(){
return this;
}
test() === window; //输出结果是true

严格模式下,this未被执行的上下文环境定义,它默认为undefined

1
2
3
4
5
function test(){
"use strict";
return this;
}
test() === undefined; //输出结果是true

情况二:作为对象方法的调用

函数作为方法被对象调用,this指向调用该函数的对象

1
2
3
4
5
6
function test(){
return this.x;
}
var obj = {x: 1994};
obj.y = test;
console.log(obj.y()); // 1994

情况三:作为构造函数调用

如果函数倾向于和new关键词一块使用,则我们称这个函数是构造函数。在函数内部,this 指向新创建的对象。

1
2
3
4
5
function test(){
this.x = 1994;
}
var obj = new test();
console.log(obj.x); // 1994

情况四:call 和 apply调用

call()函数和apply()函数是每个函数都有的方法,可以通过设置第一个参数,改变绑定到指定对象上;
apply()方法接受两个参数:第一个参数就表示改变后的调用这个函数的对象,第二个是参数数组(可以是Array的实例,也可以是arguments对象)
call()方法和apply()方法的区别在于接受参数的方式不同,对于call()方法来说,第一个参数不变,变化的是后面的参数必须逐个列举出来;

1
2
3
4
5
6
7
8
9
function add(c,d){
return this.a+this.b+c+d;
}
var obj = {a:1,b:1};
add.apply(obj, [1,1]); // 1+1+1+1=4
add.call(obj, 2, 2); // 1+1+2+2=6

参考文章值得一读:
秘密花园
阮一峰的网络日志-Javascript的this用法
this - JavaScript | MDN - Mozilla Developer Network