关于this的指向;

构造函数中this的指向

相关代码

最近在读js高级编程,有点迷惑的地方。

在普通的函数中,this是指向全局作用域的:
var name = 'moon';
function sayName(){

var name = 'star';
console.log(this.name); //moon

}

但是在构造函数里,this是指向谁:
function Person(name, age){

this.name = name; //这里为啥可以这样写,不太明白,虽然我也这样写
this.age = age;

}
var p1 = new Person('sun', 22);

书上写的是: 将构造函数的作用域赋给新对象,因此this指向了这个新对象。为什么第一种情况this是全局作用域,而第二种情况就成了函数作用域了呢,求解惑

阅读 1.2k
1 个回答

单就你题目中的两个例子,this都是在运行时才能确定的:即看他们执行时绑定在什么对象上,那个this就代指那个对象。

  1. sayName这个函数,
    如果你直接执行,它相当于在全局执行,默认绑定在window对象上(此处先不讨论严格模式),故this是window。 var name="moon"在全局定义的,那么它就是window的一个属性,相当于window.name="moon"
    若你执行 sayName.call({name: 'sun'}), 即将sayName绑定在对象{name: 'sun'}上执行,那么this就是这个sun对象。
  2. new操作符执行后,会创建一个空对象 {}, 然后类似于执行了

    var newObj = {}; 
    Person.call(newObj, name, age);
    var pi = newObj;

    当然new做的操作不止这些,还有设置原型链,不在此问题讨论范围内。

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