关于this的指向

var a = 20;
var obj = {
    a: 10,
    c: this.a + 20,
    fn: function () {
         return this.a;
     }
}
            
console.log(obj.c);   //40
console.log(obj.fn());//10

第二个可以理解,第一个为什么是全局呢?

阅读 3k
6 个回答

看你上面的评论就能看出你没理解js中的this 在js中this的指向跟定义没关系 只取决于调用模式
console.log(obj.c);就相当于console.log(this.a+20) 在这种情况下 this毋庸置疑是指向全局的
第二种 console.log(obj.fn());//10是方法调用 this 就只想包含这个函数的对象

    1. 普通函数调用,this为全局对象或是undefined
    2. 作为对象的方法,this为那个对象
    3. new 表达式,this为以该函数为原型的新创建的对象
    4. 使用 apply/call指定 this
    5. 用bind绑定固定的this
    6. 事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)
    var obj = {
        c: this
    };
    console.log(obj.c); //window

c是obj对象的属性,那么为毛这个this是window不是obj本身?换个写法。。

    var obj = new Object();
    obj.c = this;
    console.log(obj.c); //window

这样this很明白的就是全局window了吧,和在函数里的this是两回事

obj.c = this.a + 20
console.log(obj.c)
等于
console.log(this.a + 20), 这个this指向全局

函数里的this是动态的,对象字面量里的this不是吧。

外部的a和obj是全局环境定义的两个变量

es5中的this是在函数调用时确定的,当没有函数调用时,this指向全局。所以obj.c的this指向全局环境;当以对象里的方法的方式调用函数时,它们的 this 是调用该函数的对象,所以第二个this指向obj

es6箭头函数的this与es5不同,它在定义时就确定了指向(当对象的方法中又嵌套了一个函数,在es5中嵌套函数中的this指向全局)
比如

var a = 20;
    var obj = {
        a: 10,
        c: this.a + 20,
        fn: function () {
             return (function(){
                 console.log(this)
             })();
         }
    }
           
console.log(obj.fn());  // Window
var a = 20;
    var obj = {
        a: 10,
        c: this.a + 20,
        fn: function () {
             return (() => {
                console.log(this)
             })();
         }
    }
           
console.log(obj.fn());  // Obj

this是谁调用的指向谁,第一个this是window调用的,所以指向的全局

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题