不同场景中的this
- 处于被对象调用的方法中
- 处于普通函数中
- 在构造函数中
this
的指向简单来说就是:
谁调用,就指向谁
在对象的方法中
var obj = {
name: '二狗子',
bark: function(){
console.log(this);
// obj
console.log('汪汪汪');
}
};
obj.bark();
调用者是obj
,按照上面的简单规则谁调用就指向谁
所以这里的this
就是obj
。
在普通函数中
var bark = function () {
console.log(this);
// window
}
// 注意前面没有obj
bark();
全局环境下所有的属性方法都属于window
,所以这里其实隐藏了一个window
,也是window.bark()
。·
再参照谁调用就指向谁
,所以这里的this
就是window
。
在构造函数中
构造函数其实跟普通函数没有任何区别,在没有使用new修饰符的时候,函数就是函数,只有加了new后,才成为了构造函数。
function func1(){}
function func2(){}
func1();
// 普通函数调用
new func1();
// 构造函数调用
构造函数的作用?
它会返回一个对象
function func1() {
this.name = '一号狗子';
}
function func2() {
this.name = '二号狗子';
}
var dog = new func1();
// dog1获得了一个对象
var dog = func2();
// dog2什么都没有,因为函数没有返回任何东西
当对函数使用new
修饰符时,函数的内部的this
的指向则是返回的那个对象,这是js
引擎的行为。
call apply
call
和apply
的主要用途是改变this
的指向,这两个方法属于function
类型,所以只要一个变量的原型链上有function
,那么它就有call
和apply
方法。
用法:
var obj = {
name: '二狗子',
bark: function () {
console.log(this);
}
};
obj.bark();
// obj
// 修改bark内的this指向为window
obj.bark.apply(window);
// or
obj.bark.call(window);
// window
call
和apply
只是在传参的时候有些差异。
call(thisArg, arg1, arg2, arg3)
方法接受一个参数列表。apply(thisArg, argsArray)
方法接受一个包含多个参数的数组。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。