是否可以在JavaScript中进行功能解除引用

时间:2014-03-04 23:05:39

标签: javascript

假设:

function a() {
   return 1;
}


a()++;

我收到错误,这在JS中是不可能的吗?

enter image description here

我想要的是获得值2.

2 个答案:

答案 0 :(得分:11)

你试图增加一个常量,这没有任何意义。

从本质上讲,你已经写过:

1++;

1 = 1 + 1

据我所知,这不适用于JavaScript或任何语言。当然,如果你试图这样做,Ruby,PHP和C ++都会同样死掉。

如果您想要达到值2,则需要直接添加:

a() + 1

请注意,当您不尝试修改常量值时,函数解除引用会正常工作:

function a() { return [1, 2, 3]; }

a()[1]; // 2

function b() { return {name: "bob"} }

b().name; // "bob"

答案 1 :(得分:2)

否。问题在于++(如+=)仅适用于Reference Specification Type的表达式。

也就是说,++与“变量或属性表达式”一起使用时 有效。

  

引用类型用于解释诸如delete,typeof和赋值运算符[包括+++=等]之类的运算符的行为。例如,赋值的左侧操作数应生成引用[规范类型表达式]。

var x
x++       // variable
          // same as x = x + 1, when used as statement
((x))++   // totally legal, still an RST-expression

var o = {p: 0}
o.p++     // property
          // same as o.p = o.p + 1, when used as statement

// while odd, still legal as the ++ applies to an RST-expression
var q
((q = {p: 0}).p)++  // q.p == 1, after

但是,函数调用表达式 never 会产生RST值,从而失败。 是一个SyntaxError,并且生产是允许的,但是类型错误导致运行时ReferenceError异常。

// (modified to show it is a run-time exception not related to parsing)
function f () {
   f()++  // whoops!
          // same failure as f() = f() + 1
}
f();

函数只返回值(由求值表达式产生),但在JavaScript中有 no 可赋值表达式,它产生一个RST值 - 上述运算符“消耗”RST表达式并计算为非RST值。


原始问题is possible in C++的变体,支持创建显式引用。但是,在ECMAScript中,RST主要用于描述“l值行为”,但不会暴露。

#include <iostream>
using namespace std;

int x;
int& func() {
    return x;
}

int main() {
    func()++;
    cout << x << endl;
    func()++;
    cout << x << endl;
    return 0;
}