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

Javascript 为什么我不能在构造函数中使用“var”?,javascript,Javascript,这项工作: function Question(questionTitle, answer0, answer1) { this.questionTitle = questionTitle; this.answer0 = answer0; this.answer1 = answer1; } 但这并不是: function Question(questionTitle, answer0, answer1) { var this.questionTitle = question

这项工作:

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;

}
它产生了错误uncaughtsyntaxerror:uncontractedtokenthis。使用var有什么问题?JavaScript不解释正在创建的新变量,即使不添加var关键字吗

切线问题:当不使用var时,它会向全局名称空间添加变量名吗?

您不能执行var this.foo='bar';因为它没有任何语法意义

var声明了一个变量

这是指其直接作用域内的调用对象

例如,这:

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';
}
。。。不起作用

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

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

function Question(questionTitle, answer0, answer1) {
  this.questionTitle = questionTitle;
  this.answer0 = answer0;
  this.answer1 = answer1;
}
该函数中的每一行代码都会在该函数所指向的对象上添加或设置一个属性。只要它不指向全局对象,而是指向某个其他对象,则不会向全局命名空间添加名称。它将属性添加到该对象所指向的对象。一行代码,如:

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

因此,如果您像这样使用此函数:

var q1 = new Question(...);
然后,构造函数中的这三行代码只向q1对象添加了三个属性。它们对全局名称空间没有任何影响

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

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


即使第二个示例的语法被允许,它也将创建仅在构造函数函数范围内可用的局部变量,并且不会在对象上创建属性。

只需执行var questionTitle,而不是var this.questionTitle,虽然由于已经有一个名为questionTitle的变量,因此可能会发生冲突。但无法使用var关键字something定义对象属性。name=something值正在设置对象的属性。var name=someValue正在声明一个局部变量。这两件事是非常不同的,使用不同的语法。这帮助我了解我的问题!所以当我们有var q1=新问题。。。;,这是指q1吗?使用属性和变量this.x和var x有什么区别?它们不是做了同样的事情吗?@jazza_m8这指的是调用对象,因此向其添加属性会将其绑定到调用对象,而仅仅使用var只会创建一个不能超出其范围的变量。@jazza_m8-是的,当执行var q1=new Question。。。;,在问题构造函数中,这将指向返回并分配给q1的对象。但是,this.x=foo会在它所指向的对象上创建一个属性。var x=foo在当前函数范围内创建一个局部变量。这两件事甚至不尽相同。局部变量只能在函数范围内访问,并且只要函数范围存在,局部变量就会存在。该属性对于任何有对象引用的人来说都是可访问的,并且持续时间与对象一样长。因此,我刚刚对其进行了测试,var只能在函数中本地访问,就像你们说的那样。这与闭包有什么关系?虽然我不熟悉它们,但我认为这将是一种闭包情况,构造函数保存创建它的状态,包括变量。@jazza_m8-您可以在此处阅读如何使用构造函数和相应闭包中定义的局部变量和方法来创建私有实例变量:和。闭包本身是一个长得多的对话,这里的一些评论不会对此进行描述。网上有很多关于他们的文章,所以我建议你在那里读一些。