在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是否也将l值和r值的概念视为C?
为什么函数调用表达式不能出现在赋值表达式的左侧?在上面的示例中,从a === fn()
开始,a = 5
和fn() = 5
之间的区别是什么。我知道ES5规范要求这样做,但为什么它的设计是这样的呢?
答案 0 :(得分:3)
根据specification of assignments,以下表达式无效作为作业的目标:
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
RegularExpressionLiteral
TemplateLiteral
例如,以下分配也无效:
this = "bar"; // this
"foo" = "bar"; // Literal
/foo/ = "bar"; // RegularExpressionLiteral
["foo"] = "bar"; // ArrayLiteral
答案 1 :(得分:0)
如果在调用函数之前将对象分配给f()
,a
可以求值为引用的事实并不会改变f()
是表达式的事实(与例如1+a
相同)。并且赋值只能应用于变量。 MDN
答案 2 :(得分:0)
同样,在JavaScript语言的世界观中,“this
是(必然......)神圣不可侵犯。”
目的,以及this
变量的当前值必须受到程序的任意修改保护。
同样地,“你只是不能说'一个功能',无论它是什么,'等于'5'。” (很明显,其中一个是“函数”,另一个是“整数常量”,因此,“从来没有两个人会相遇。”)
JavaScript解释器就像这个星球上的其他语言解释器一样,是使用相同的语言实现策略(和工具......)设计和构建的。被发明了。