JavaScript是否具有l值和r值的概念?

时间:2015-06-11 01:54:12

标签: javascript expression ecmascript-5 referenceerror

在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

我的问题是:

  1. JavaScript是否也将l值和r值的概念视为C?

  2. 为什么函数调用表达式不能出现在赋值表达式的左侧?在上面的示例中,从a === fn()开始,a = 5fn() = 5之间的区别是什么。我知道ES5规范要求这样做,但为什么它的设计是这样的呢?

3 个答案:

答案 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解释器就像这个星球上的其他语言解释器一样,是使用相同的语言实现策略(和工具......)设计和构建的。被发明了。