Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是javascript';s'return'真的是一个*关键字*?_Javascript_Language Design - Fatal编程技术网

是javascript';s'return'真的是一个*关键字*?

是javascript';s'return'真的是一个*关键字*?,javascript,language-design,Javascript,Language Design,在nodejs和浏览器上运行此snip时不会有任何抱怨: this.return = function ( x ) { return x }; console.log ( this.return(1) ); 我原以为它会因为语法错误而失败 我的意思是,我能理解为什么这个['return']有效。。但我一直认为return是一个lexer关键字 javascript是上下文敏感语言吗 添加了:重点是lexer没有T_返回标记,但它使用了一些T_字符串。不是吗?是的,return是一

在nodejs和浏览器上运行此snip时不会有任何抱怨:

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

console.log ( this.return(1) );
我原以为它会因为语法错误而失败

我的意思是,我能理解为什么这个['return']有效。。但我一直认为
return
是一个lexer关键字

javascript是上下文敏感语言吗


添加了:重点是lexer没有T_返回标记,但它使用了一些T_字符串。不是吗?

是的,return是一个关键字。您已经定义了一个属性,实际上使用了一个名为return的字符串。如果您实际使用return,则会导致错误

var return=“error”//未捕获的语法错误:意外的令牌返回
返回
是一个错误,但是保留关键字可以作为一个错误使用,这样做通常是不好的做法

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

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

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

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

a.return
a["return"]
a = { return: "test" }.
然而,这些都不是

function return() {}
var return;

您也可以覆盖未定义的。这并不意味着这是个好主意!编辑:从技术上讲,您并没有覆盖return。我对解释器一无所知,但对我来说,在这样一个
之后,任何可以解析为标识符的东西都是有效的。@Niet:我对解析自己有点了解,这让我感到惊讶——通常是词法分析(在纯语法级别将原始文本转换为令牌流)这是第一步,它会标记关键字,而不考虑使用上下文。这让我很惊讶,因为我似乎记得以前我使用
do
作为属性名时遇到了一个问题,忘记了它是一个关键字。但我想这可能是在对象文字中,所以我猜它是不同的。我还记得它影响了dif不同的浏览器有所不同。@JosiahKeller:区别在于从ECMAScript 3到ECMAScript 5的变化。ES5中的对象文字可以毫无问题地使用关键字属性标识符。我以前也遇到过类似的情况。虽然技术上可能,但使用保留关键字被认为是一个坏主意,因为它使代码难以重新读取kittycat3141:我认为这是一种不好的做法,因为a)人们可能不习惯它(这可能就是你所指的),b)该代码不在旧版本的IE8中运行。然而,一旦ES6发布(定义了
Map#delete
),a)将有望改变。@FelixKling-很容易被弄糊涂,前一分钟你在做
foo[“return”]
,下一分钟你在做
foo[return]
,你不明白为什么它不起作用。此外,一些小型化软件和/或IDE在突然看到它不属于的位置时可能会出现问题,特别是如果您执行类似于
foo.return的操作时,这与一分钟执行
foo[“bar”]
和下一分钟执行
foo[bar]
有何不同?由于语法错误,使用关键字可以更容易地修复问题,而如果定义了
bar
变量,问题就不那么清楚了。不理解ES5的IDE和迷你程序需要更新或留下。@sixfingeredman-这不是真的,但你必须定义
return
某个地方来做
foo[return]
,这可能会让不知道保留关键字的人感到困惑,仅此而已。这里一直有一些问题,人们开始以最奇怪的方式使用
this
delete
,问题的关键是,通常最好远离保留关键字,即使它们完全被允许作为属性。你正在学习“define”,这在这个过程的后面会发生。。Lexer->Scanner->Parser。我原以为它会在扫描仪级别引发错误。