JS 浏览器和 node 脚本 this 的区别

function test() {
  var name = 'tom';

  var obj = {
    name: 'jack',
    nick: 'halun',
    frind: this.name+"  "+this.nick,
    print: function (){
      console.log(this.name);
    }
  }

  console.log(obj.frind);
  obj.print();
}
test();

在给 obj 赋值时,node 环境下无法访问到 this.namevv
请问这是什么原因

阅读 2.5k
1 个回答

如果在浏览器环境下:
console.log(obj.frind);这句想打印obj对象的frind属性,但是frind: this.name+" "+this.nick,这里的this指向哪个对象呢?这里需要注意的是:obj是字面量对象,它是没有this变量的,那么这个this应该是指向全局对象window,但是window对象下没有name和,window下有一个默认的name属性,但值为空字符串,而无nick属性,所以这时会打印:
clipboard.png
注意undefined前面有个空格对应的是this.name。

node全局环境下应该是没有name和nick属性的,那么会打印两个undefined:
clipboard.png

PS:关于this,调用obj.print()时,相当于调用了一个函数,函数被调用时都会自动获得两个特殊变量:this和arguments。this对象是在运行时基于函数的执行环境绑定的,在全局环境下,this指向全局对象(浏览器中是Window对象),而当函数被作为某个对象的方法调用时,this就指向这个对象(参考《JavaScript高级程序设计》第7章函数表达式 第182页)。

再啰嗦两句:我觉得this最好只在对象的方法中出现,这样它被哪个对象调用,this就指向哪个对象,否则this就会指向全局对象。

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