在另一个问题中,有人有一个不正确的类定义,其中包含如下代码:
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 函数不返回引用,并且没有规定用户定义的函数返回引用。 (不使用句法案例分析的另一个原因是它会冗长且尴尬,影响规范的许多部分。)
是否存在函数可以返回可分配给的内容的上下文?
所以,不。没有用户定义的函数可以返回我们可以为其赋值的引用。
为什么这不会导致语法错误,而是根据函数是否定义而产生不同的错误?
正如规范中提到的,语法分析将是冗长、笨拙并且影响规范的许多部分。所以,语法检查没有完成。