this
解析器在调用函数时,每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是 this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象。
函数内this的指向
我们都知道,函数的调用有六种形式。
根据函数的调用方式的不同,this会指向不同的对象:
-1.以函数的形式(包括普通函数、定时器函数、立即执行函数)调用时,this的指向永远都是window。比如fun();相当于window.fun();
-2.以方法的形式调用时,this指向调用方法的那个对象
-3.以构造函数的形式调用时,this指向实例对象
-4.以事件绑定函数的形式调用时,this指向绑定事件的对象
-5.使用call和apply调用时,this指向指定的那个对象
function fun(){
console.log(this);
console.long(this.name);
}
var obj1 = {
name:'smyh',
sayName:fun
};
var obj2 = {
name:'vso',
sayName:fun
};
var name = '全局name属性';
fun();
打印结果:
window
全局name属性
上面的举例可以看出,this指向的是window对象,所以this。name指的是全局的name。
function fun(){
console.log(this);
console.log(this.name);
}
var obj1 = {
name:'smyh',
sayName:'fun'
};
var obj2 = {
name:'cad',
sayName:'fun'
};
var name = '全局name属性';
obj2.sayName();
打印结果:
Object
cad
上面的举例可以看出,this指向的对象是obj2,所以this.name指的是obj2.name。
箭头函数中this的指向
ES6中的箭头函数并不会使用上面的准则,而是会继承外层函数调用的this绑定(无论this绑定到什么)。
改变函数内部的 this指向
JS专门为我们提供了一些方法来改变函数内部的this指向。如:call()、apply()、bind()方法。