this指向的规则
1.默认绑定
默认绑定就是什么都匹配不到的情况下,非严格模式this绑定到全局对象window或者global,严格模式绑定到undefined;
2.隐式绑定
隐式绑定就是函数作为对象的属性,通过对象属性的方式调用,这个时候this绑定到对象;
3.显示绑定
显示绑定就是通过apply和call调用的方式;
4.new绑定
new绑定就是通过new操作符时将this绑定到当前新创建的对象中,它们的匹配有限是是从小到大的。
this指向常见例子
1.
function a(){
var user = "追梦子";
console.log(this.user);
console.log(this);
}
a();
输出:
undefined
Window
相当于window.a();
全局执行环境,默认绑定
2.
var o = {
user:"追梦子",
fn:function(){
console.log(this.user);
}
}
o.fn();
输出
追梦子
因为你调用这个fn是通过o.fn()执行的,那自然指向就是对象o,这里强调一点,this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁
3.
var o = {
a:10,
b:{
fn:function(){
console.log(this.a);
}
}
}
o.b.fn();
输出:
undefined
这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对像
4.
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a);
console.log(this);
}
}
}
var j = o.b.fn;
j();
输出:
undefined
window
虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行,只是将函数引用赋值给了j,所以最终指向的是window
5.
function fn()
{
this.user = '追梦子';
return {};
}
var a = new fn;
console.log(a.user);
输出:
undefined
6.
function fn()
{
this.user = '追梦子';
return function(){};
}
var a = new fn;
console.log(a.user);
输出:
undefined
7.
function fn()
{
this.user = '追梦子';
return 1;
}
var a = new fn;
console.log(a.user);
输出:
追梦子
8.
function fn()
{
this.user = '追梦子';
return undefined;
}
var a = new fn;
console.log(a.user);
//追梦子
5-8:
如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
this碰到return时 除了null外,其他对象都会返回undefined。
9.一道面试题
var length = 10;
function fn() {
console.log(this.length)
};
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
fn.call(obj, 12);
}
};
obj.method(fn, 1);
输出
10 2 5
fn();//没有显式的指定它的调用对象,所以这里的this指向window,对应第一条规则
arguments[0]();//对象方法的关联数组形式调用,这里的arguments是一个类数组,这里指 obj.method(fn, 1)的参数个数。对应第二条规则
fn.call(obj, 12);//绑定到了obj上,对应第三条规则
结合了 https://www.cnblogs.com/pssp/p/5216085.html 的内容