this指向谁?
this指向谁,取决于函数的调用模式
在JS中函数的调用模式共四种:
函数调用模式——this指向window
直接使用函数名调用,或者使用指向函数引用的标识符调用函数即为函数调用模式
例如:
function test(){
console.log(this);
}
test()//函数调用模式
var fun = test;
fun();//函数调用模式
/*-----------*/
var obj = {
test : test,
fun : function (){
console.log(this);
}
}
var foo = obj.test;
foo();//函数调用模式
var bar = obj.fun;
bar();//函数调用模式
方法调用模式——this指向某个对象
当一个函数被保存为对象的一个属性时,称该函数为方法。使用‘.’或‘[‘指向函数引用的属性’]’去调用方法我们称之为方法调用模式
例如:
var a = 111;
function test(){
console.log(this.a + '-a');
}
var obj = {
a : 222,
test : test,
fun : function (){
console.log(this.a + '-b');
}
}
obj.test();//222——方法调用模式
obj.fun();//222——方法调用模式
构造器调用模式(new)——this指向构造函数内创建的新对象
对于这种模式下的this指向不用多说,因为算是比较简单了。但请注意下列问题:
- 在JS中,构造函数只是一些使用new操作符时被调用的普通函数,因此与其他函数并没有特别之处
call()/apply()调用模式——this指向传入的对象
对于这种模式下的this指向也不多说!但注意以下问题:
当你使用call/apply改变this指向时,如果你传入的是除undefined与null之外的原始值(string/boolean/number),那么这个原始值会转换为它的对象形式(即new String/Boolean/Number(…))
如果传入的时undefined/null,在非严格模式下this指向window,严格模式下this指向undefined/null
小练习:
var name = '222';
var a = {
name:'111',
say:function () {
console.log(this.name);
}
}
var fun = a.say;
fun();
a.say();
var b = {
name: '333',
say: function (fun) {
fun();
}
b.say(a.say);
fun();
b.say = a.say;
b.say();
ps:本文案参考了以下书籍
《你不知道的JavaScript》
《JavaScript语言精粹》