2014-12-05 95 views
11

這剪斷將運行,沒有任何抱怨兩個和的NodeJS瀏覽器:是javascript的`return`真的是*關鍵字*?

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

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

我期待它有一個語法錯誤要失敗硬。

我的意思是,我可以理解爲什麼this['return']工程..但我總是雖然return是一個詞法分析關鍵字?

是JavaScript的上下文敏感語言?

added:問題是詞法分析器沒有T_RETURN標記,但它使用了一些T_STRING來代替。是不是?

+0

您可以覆蓋不確定了。這並不意味着這是一個好主意!編輯:從技術上說,你不會覆蓋回報。 – 2014-12-05 22:58:49

+0

我對解釋器一無所知,但對我來說,只有「有道理」,在這樣一個'.'之後,任何可以解析爲標識符的東西都是有效的。 – 2014-12-05 22:59:07

+0

它是一個保留的關鍵字,但這些可以用作屬性而不會彈出錯誤,這樣做只是一個非常糟糕的主意。 – adeneo 2014-12-05 22:59:22

回答

1

是的,return是一個關鍵字。你已經定義了一個屬性,並使用了一個名爲return的字符串。假如你實際使用的回報它會導致錯誤

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

+0

你正在考慮有關「定義」,這真的發生在這個過程後面真的很晚.. Lexer - >掃描儀 - >解析器。我期待它在掃描儀級別引發錯誤。 – eridal 2014-12-06 00:57:15

10

returnreserved keyword,但保留關鍵字可以作爲一個property accessors沒有問題,它只是一般不好的做法,這樣做。

保留關鍵字,具體可以不被用作變量,函數,方法,或標識爲數組和對象的名字,因爲ECMAScript中指定特殊的行爲對他們來說:

從ECMAScript的腳本中的源文本被掃描從左然後轉換爲一系列輸入元素,這些元素是標記,控制字符,行結束符,註釋或空格。

ECMAScript還定義了某些關鍵字和文字,並且有自動將分號插入結束語句的規則。

保留字實際上只適用於標識符(與標識符名稱)。
ES5中所述,這些都是不排除ReservedWords的IdentifierNames。

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

但是這些都不是

function return() {} 
var return; 

More on MDN

+0

我遇到過類似的東西。儘管技術上可行,但使用保留關鍵字被認爲是一個糟糕的主意,因爲它會讓您的代碼很難在以後閱讀和理解。 – FlyingPiMonster 2014-12-05 23:10:46

+2

@ kittycat3141:我會說這是不好的做法,因爲a)人們可能不習慣它(這可能是你所指的),b)代碼不能在老版本的IE8中運行。但是,a)一旦ES6被釋放(定義'Map#delete'),希望能夠改變。 – 2014-12-05 23:12:12

+0

@FelixKling - 很容易混淆,一分鐘你做'foo [「return」]',下一個你做'foo [return]',並且不明白爲什麼它不起作用。還有一些縮小軟件和/或IDE的突然看到'返回'它不屬於,特別是如果你做'foo.return'這樣的事情時可能會有問題 – adeneo 2014-12-05 23:18:47