为什么我不能在构造函数中使用'var'?

时间:2016-01-10 07:55:01

标签: javascript

这有效:

function Question(questionTitle, answer0, answer1) {

  this.questionTitle = questionTitle;
  this.answer0 = answer0;
  this.answer1 = answer1;

}

但这不是:

function Question(questionTitle, answer0, answer1) {

  var this.questionTitle = questionTitle;
  var this.answer0 = answer0;
  var this.answer1 = answer1;

}

它出现错误“Uncaught SyntaxError:Unexpected token this”。使用var有什么问题?即使没有添加var关键字,JavaScript也不会解释正在创建的新变量吗?

正切问题:当不使用var时,是否将变量名称添加到全局命名空间?

2 个答案:

答案 0 :(得分:2)

  

正切问题:它是否将变量名称添加到全局名称空间   什么时候不使用var?

这似乎是你误解的根源。使用此语法时:

function Question(questionTitle, answer0, answer1) {
  this.questionTitle = questionTitle;
  this.answer0 = answer0;
  this.answer1 = answer1;
}

该函数中的每行代码都在this指向的对象上添加或设置属性。只要this没有指向全局对象,而是指向某个其他对象,然后" NO",它就不会向全局命名空间添加名称。它为this指向的对象添加属性。一行代码如:

  this.questionTitle = questionTitle;

指示Javascript获取this指向的对象。将名为questionTitle的对象上的属性设置为questionTitle变量的值。如果这样的属性尚不存在,那么创建它并给它这个值。

所以,如果你像这样使用这个函数:

var q1 = new Question(...);

然后,构造函数中的这三行代码只向q1对象添加了三个属性。 根本不会影响全局命名空间。

此语法不是在您正在讨论的意义上创建新变量。它在对象上创建新属性。在Javascript中,在为对象分配属性时不使用var。您只需使用object.property = value语法分配属性,如果该属性尚不存在,则会为您创建该属性。

您的其他语法不起作用仅仅因为它在Javascript中是非法的语法。 var之后的标识符必须遵循一组语法规则,其中一个规则是它不能包含句点,因此它只是非法语法。

即使你的第二个例子的语法是以某种方式允许的,它也会创建只在构造函数范围内可用的局部变量,并且不会在你的对象上创建属性。

答案 1 :(得分:0)

你不能var this.foo = 'bar';,因为它没有任何语法意义。

  • var声明一个变量。

  • this指的是直接范围内的调用对象。

例如,这个:

function someObject(){
    // We are assigning `someObject` its own property `foo`.
    this.foo = 'bar';
}

与此不同:

function someObject(){
    // We are assigning some variable within the scope of this function named `foo`
    var foo = 'bar';
}

所以希望你能看到这样做......

function someObject(){
    // Illegal
    var this.foo = 'bar';
}

......不会工作。