JavaScript是否有l值和r值的概念?
在JavaScript中,如果在赋值表达式的左侧放置某种表达式,引擎将抛出ReferenceError。比如说,JavaScript是否有l值和r值的概念?,javascript,expression,ecmascript-5,referenceerror,Javascript,Expression,Ecmascript 5,Referenceerror,在JavaScript中,如果在赋值表达式的左侧放置某种表达式,引擎将抛出ReferenceError。比如说, // 'this' on the left side this = window; // ReferenceError: Invalid left-hand side in assignment 或 或 我的问题是: JavaScript是否也有l值和r值作为C的概念 为什么函数调用表达式不能出现在赋值表达式的左侧?在上面的例子中,既然a===fn(),那么a=5和fn()=5之间
// 'this' on the left side
this = window; // ReferenceError: Invalid left-hand side in assignment
或
或
我的问题是:
a===fn()
,那么a=5
和fn()=5
之间有什么区别呢。我知道ES5规范规定了这一点,但为什么它设计成这样呢如果在调用函数之前将对象分配给
a
,则f()
可以计算为引用的事实不会改变f()
是表达式的事实(例如,与1+a
相同)。和赋值只能应用于变量 同样,在JavaScript语言的世界观中,“这是(必然的…)神圣不可侵犯的。”
此
变量的用途以及当前值必须受到保护,以防程序任意修改
同样,“你不能简单地说‘一个函数’,不管它是什么,’等于‘5’。”(很明显,其中一个是‘函数’,另一个是‘整型常数’,因此,“两者永远不会相遇。”)
JavaScript解释器与地球上所有其他语言解释器一样,是使用所有其他发明的语言所采用的相同语言实现策略(和工具…)设计和构建的。根据,以下表达式不能作为任务的目标:
这个
字面意义的
阵列侧
ObjectLiteral
函数表达式
类表达式
生成表达式
正则表达式文字
模板实验室
例如,以下分配也无效:
this=“bar”//这
“foo”=“bar”;//字面意义的
/foo/=“bar”;//正则表达式文字
[“foo”]=“bar”//阵列侧
fn()
是一个表达式而不是变量引用,您不能为它赋值。但是求值顺序是从左到右,如果先求值fn()
,它将返回a
,因为fn()==a
。而a
是一个变量,可以存储值。它返回a的值,而不是对变量a的引用a===fn()
并不意味着它们是同一个内存位置,如果是的话,它将具有相同的语义。。。所以,表达式的赋值是没有意义的。嗨,帕特里克·埃文斯,你能详细解释一下答案吗?嗨,基里尔,谢谢你的回答<代码>和赋值只能应用于变量。
我认为这不准确。您完全可以将赋值应用于对象属性和数组元素,除了变量。.@leslie.zhang实际上,对象属性和数组元素可以被视为变量引用,因此可以用于赋值。
// 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