【问题标题】:is javascript's `return` really a *keyword*?javascript 的 `return` 真的是*关键字*吗?
【发布时间】:2014-12-05 22:56:31
【问题描述】:

这个片段将在 nodejs 和浏览器上运行而没有任何抱怨:

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

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

我原以为它会因语法错误而失败。

我的意思是,我可以理解为什么 this['return'] 有效.. 但我一直认为 return 是词法分析器关键字?

javascript 是一种上下文相关的语言吗?

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

【问题讨论】:

  • 你也可以覆盖 undefined。不代表这是个好主意!编辑:从技术上讲,您不会覆盖 return。
  • 我对解释器一无所知,但对我来说,在. 之后,任何可以被解析为标识符的东西都是有效的。
  • @Niet:对自己的解析有所了解,相反的方式让我感到惊讶——通常,词法分析(在纯语法级别将原始文本转换为标记流)是第一步,并且无论使用上下文如何,都会标记关键字。
  • 这让我很吃惊,因为我似乎记得在使用do 作为属性名称之前遇到过问题,忘记了它是一个关键字。但我认为这可能是在对象文字中,所以我想它是不同的。我还记得它对不同浏览器的影响不同。
  • @JosiahKeller:区别在于从 ECMAScript 3 到 ECMAScript 5 的变化。ES5 中的对象文字可以毫无问题地使用关键字属性标识符。

标签: javascript language-design


【解决方案1】:

return 是 reserved keyword,但保留关键字可以毫无问题地用作 property accessors,这样做通常是不好的做法。

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

ECMAScript 脚本的源文本从左到右被扫描,并被转换为一系列输入元素,这些元素是标记、控制字符、行终止符、cmets 或空格。

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

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

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

这些都不是

function return() {}
var return;

More on MDN

【讨论】:

  • 我之前遇到过类似的事情。虽然在技术上可行,但使用保留关键字被认为是一个坏主意,因为这会使您的代码难以在以后阅读和理解。
  • @kittycat3141:我会说这是不好的做法,因为 a)人们可能不习惯它(这可能是你所指的)和 b)代码不能在旧版本中运行IE8 的。但是,一旦 ES6 发布(定义 Map#delete),a) 有望改变。
  • @FelixKling - 很容易混淆,前一分钟你在做foo["return"],下一分钟你在做foo[return],不明白为什么它不起作用。此外,一些缩小软件和/或 IDE 在突然看到不属于它的 return 时可能会出现问题,尤其是当您执行 foo.return 之类的操作时。
  • 这与前一分钟执行foo["bar"] 和下一分钟执行foo[bar] 有何不同?由于语法错误,使用关键字可以更轻松地解决问题,而如果您定义了bar 变量,则问题就不太清楚了。不理解 ES5 的 IDE 和 minifiers 需要更新或抛在后面。
  • @sixfingeredman - 这不是真的,但你必须在某个地方定义return 才能执行foo[return],这可能会让那些不知道保留关键字的人感到困惑,仅此而已.人们总是以最奇怪的方式开始使用this 或delete,这里的问题只是通常最好远离保留关键字,即使它们被完全允许作为属性。跨度>
【解决方案2】:

是的,return 是一个关键字。您已经定义了一个属性,并且基本上使用了一个名为 return 的字符串。如果你真的使用了 return 它会导致错误

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

【讨论】:

  • 您正在考虑“定义”,这确实发生在该过程的后期.. Lexer -> Scanner -> Parser。我期待它会在扫描仪级别引发错误。
猜你喜欢
  • 2016-08-30
  • 2014-12-24
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2022-01-10
  • 2016-03-11
相关资源
最近更新 更多