Javascript 为什么funcname()=值;有效语法?

Javascript 为什么funcname()=值;有效语法?,javascript,syntax,Javascript,Syntax,在中,有人的类定义不正确,其中包含以下代码: var myClass = function() { ... this.name() = function() { ... }; } 明显的错误是该方法应该用this.name=…定义,而不在name后面加括号。调用构造函数时,会出现一个错误,因为未定义this.name。我在控制台中创建了一个更简单的示例: foo() = 3; // Causes: ReferenceError: foo is not defined

在中,有人的类定义不正确,其中包含以下代码:

var myClass = function() {
    ...
    this.name() = function() { ... };
}
明显的错误是该方法应该用
this.name=…
定义,而不在
name
后面加括号。调用构造函数时,会出现一个错误,因为未定义
this.name
。我在控制台中创建了一个更简单的示例:

foo() = 3;      // Causes: ReferenceError: foo is not defined
function foo() {};
foo() = 3;      // Causes: ReferenceError: Invalid left-hand side in assignment
是否存在函数可以返回可分配给的内容的上下文?我认为JavaScript并没有像C++或PHP那样的指派。为什么这不会导致语法错误,而不是根据函数是否定义而产生不同的错误?

引用

例如,赋值的左操作数将生成引用。相反,赋值行为可以完全通过对赋值运算符左侧操作数的语法形式的案例分析来解释,但有一个困难:允许函数调用返回引用。这种可能性完全是为了主机对象而允许的此规范定义的内置ECMAScript函数不返回引用,并且没有规定用户定义函数返回引用。(不使用语法案例分析的另一个原因是,它会冗长而笨拙,影响规范的许多部分。)


是否存在函数可以返回可分配给的内容的上下文

不,没有用户定义的函数可以返回一个我们可以赋值的引用

为什么这不会导致语法错误,而不是取决于函数是否定义的不同错误


正如规范中提到的,语法分析将是冗长、笨拙的,并且会影响规范的许多部分。因此,语法检查没有完成。

语法的定义方式不是语法错误。我知道没有任何方法可以使用语法来构造语义上有效的东西。我对这个问题的困惑来自标题:“为什么funcname()=value;有效语法?”在任何情况下,这都是有效语法。总是会抛出错误。此外,当然
ReferenceError
会取代
SyntaxError
——在示例代码中,解释器要做的第一件事是尝试运行未定义的函数。@ncksllvn但“错误”与语法错误不同。规范似乎很清楚为什么它不是语法错误。@ncksllvn如果您从未执行它,它不会抛出错误。因此他们这样做是为了使规范更简单,并可能允许某些特定于供应商的功能?我可以接受。