为什么funcname()= value; 有效的语法?

Bar*_*mar 23 javascript syntax

另一个问题中,有人有一个不正确的类定义,包括如下代码:

var myClass = function() {
    ...
    this.name() = function() { ... };
}
Run Code Online (Sandbox Code Playgroud)

明显的错误是该方法应该定义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
Run Code Online (Sandbox Code Playgroud)

是否有任何上下文函数可以返回可以分配的内容?我不认为Javascript有可以分配给C++或PHP的引用.为什么这不会导致语法错误,而不是根据函数是否定义而导致不同的错误?

the*_*eye 21

引用ECMA Script 5.1参考规范,

例如,期望赋值的左侧操作数生成引用.相反,赋值行为可以完全根据赋值运算符的左侧操作数的句法形式的案例分析来解释,但是对于一个难点:允许函数调用返回引用.纯粹为了宿主对象而承认这种可能性.此规范未定义的内置ECMAScript函数返回引用,并且没有为用户定义的函数提供返回引用的规定.(另一个理由不使用句法案例分析是,这将是漫长而尴尬,影响了规范的许多地方.)


是否有任何上下文函数可以返回可以分配的内容?

所以不行.没有用户定义的函数可以返回我们可以为其分配值的引用.

为什么这不会导致语法错误,而不是根据函数是否定义而导致不同的错误?

如说明书中所提到的,句法分析将是漫长的,笨拙的并影响规范的许多部分.因此,语法检查没有完成.

  • 所以他们这样做是为了保持规范更简单,并可能允许一些供应商特定的功能?我可以接受. (6认同)