【发布时间】:2015-08-26 12:41:37
【问题描述】:
在 JavaScript 中,如果您将某种表达式放在赋值表达式的左侧,引擎将抛出 ReferenceError。例如,
// 'this' on the left side
this = window; // ReferenceError: Invalid left-hand side in assignment
或
// function call expression on the left side
var a;
var fn = function() {return a};
a === fn(); // true
a = 1; // 1
fn() = 5; // ReferenceError: Invalid left-hand side in assignment
或
var a;
a = 1; // 1
(a) = 2; // 2
(1, a) = 3; // ReferenceError: Invalid left-hand side in assignment
我的问题是:
JavaScript 是否也像 C 一样具有左值和右值的概念?
为什么函数调用表达式不能出现在赋值表达式的左侧?在上面的例子中,由于
a === fn(),a = 5和fn() = 5有什么区别。我知道 ES5 规范要求这样做,但为什么要这样设计?
【问题讨论】:
-
fn()是一个表达式而不是一个变量引用,你不能给它赋值。 -
但是计算顺序是从左到右,如果先计算
fn(),会返回a,因为fn() === a。而a是一个变量,可以存储值。 -
它返回 a 的值,而不是对变量 a 的引用
-
a === fn()并不意味着它们是相同的内存位置,如果是,它将具有 COW 语义......因此,分配给表达式是没有意义的。 -
嗨@Patrick Evans,您能详细说明一下吗?
标签: javascript expression ecmascript-5 referenceerror