问题 是javascript的`return`真的是*关键字*?


这个剪辑将在nodejs和浏览器上没有任何抱怨的情况下运行:

this.return = function ( x ) { 
    return x 
};

console.log ( this.return(1) );

我期待它因语法错误而难以理解。

我的意思是,我能理解为什么 this['return'] 工作......但我总是这样 return 是lexer关键字?

javascript是一种上下文敏感的语言?

添加:重点是词法分析器没有T_RETURN标记,但它使用了一些T_STRING。是不是?


8867
2017-12-05 22:56


起源

你也可以覆盖undefined。这并不意味着它是个好主意!编辑:从技术上讲,你不会覆盖回报。 - Andy Ray
我对口译员一无所知,但对我而言,这样做之后“才有意义” .,任何可以解析为标识符的内容都是有效的。 - Niet the Dark Absol
@Niet:对解析自己有点了解,让我感到惊讶的是相反的方式 - 通常,lexing(在纯语法级别将原始文本转换为令牌流)是第一步,它会标记关键字而不管使用背景。 - Cameron
这令我感到惊讶,因为我似乎记得在我使用之前遇到过问题 do 作为属性名称,忘记它是一个关键字。但我认为这可能是在一个对象字面上,所以我猜它是不同的。我还记得它对不同浏览器的影响不同。 - Josiah Keller
@JosiahKeller:区别在于从ECMAScript 3到ECMAScript 5的变化.ES5中的对象文字可以使用关键字属性标识符而不会出现问题。 - six fingered man


答案:


return 是一个 保留关键字,但保留的关键字可以用作 财产访问者 没有问题,这通常是不好的做法。

保留关键字可能不会被用作数组和对象的变量,函数,方法或标识符的名称,因为ECMAScript为它们指定了特殊行为:

来自ECMAScript脚本的源文本从左向右扫描并转换为一系列输入元素,即令牌,控制字符,行终止符,注释或空格。

ECMAScript还定义了某些关键字和文字,并具有自动将分号插入到结束语句的规则。

保留字实际上仅适用于标识符(与IdentifierNames对比)。
如中所述 ES5,这些都是不排除ReservedWords的IdentifierNames。

a.return
a["return"]
a = { return: "test" }.

但事实并非如此

function return() {}
var return;

有关MDN的更多信息


10
2017-12-05 23:05



我以前遇到过类似的东西。虽然技术上可行,但使用保留关键字被认为是一个坏主意,因为它会使您的代码难以阅读和理解。 - FlyingPiMonster
@ kittycat3141:我认为这是不好的做法,因为a)人们可能不习惯它(可能是你所指的)和b)代码不能在旧版本的IE8中运行。但是,a)一旦发布ES6(将定义为ES6),将有希望改变 Map#delete)。 - Felix Kling
@FelixKling - 你很容易混淆,一分钟你在做 foo["return"],接下来你要做的 foo[return] 并且无法理解为什么它不起作用。还有一些缩小软件和/或IDE在突然看到时会出现问题 return 它不属于哪里,尤其是你做的事情 foo.return - adeneo
怎么与一分钟不同 foo["bar"] 而下一分钟呢 foo[bar]?使用关键字可以更容易解决问题,因为语法错误,而如果你有一个 bar 变量定义,问题远没有明确。不了解ES5的IDE和minifiers需要更新或留下。 - six fingered man
@sixfingeredman - 这不是真的,但你必须定义 return 某个地方要做 foo[return] 对于那些不太了解保留关键字的人来说,这可能会让人感到困惑。人们开始使用的时候总会有问题 this 要么 delete 从最奇怪的方面来看,重点仅在于保持远离保留关键字通常更好,即使它们完全被允许作为属性。 - adeneo


是的,return是一个关键字。您已经定义了一个属性,并且实际上使用了一个名为return如果你实际使用了返回它会导致错误

var return = "error";//Uncaught SyntaxError: Unexpected token return


1
2017-12-05 23:00



你正在采取“定义”,这真的发生在过程的后期.. Lexer - > Scanner - > Parser。我原以为它会在扫描仪级别引发错误。 - eridal