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

时间:2014-10-24 15:18:00

标签: javascript syntax

another question中,某人的类定义不正确,其中包含以下代码:

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的引用。为什么这不会导致语法错误,而不是根据函数是否定义而导致不同的错误?

1 个答案:

答案 0 :(得分:18)

引自ECMA Script 5.1 Specification for References

  

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


  

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

所以,不。没有用户定义的函数可以返回我们可以为其赋值的引用。

  

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

如规范中所述,语法分析将是冗长,笨拙且影响规范的许多部分。因此,语法检查没有完成。