未绑定的JavaScript文字会发生什么?

7
未绑定(即未赋值)到变量的 JavaScript 字面量(字符串、数字)会发生什么?
// A comment
"Practically, also a comment"
var assigned = "something"
53
423.0022 
NaN
"does it impact performance"
// or is it treated just like a comment?

浏览器似乎忽略它们,但我在规范中找不到具体的规则。


1
参考:表达式语句 - Mike Cluck
我不遵循ES3.1,但必须添加严格模式(顺便说一下,它是通过表达式语句中的字符串字面量来检测的) - user5066707
实际上,现实世界中的JS引擎很可能会优化掉那些没有副作用的“未使用”表达式。 - joews
5个回答

8
这些是“表达式语句”。这样的表达式会被计算,但由于它们没有被赋值,它们的值不会被存储。JavaScript 引擎很可能会检测到那些没有副作用的表达式,并将它们消除,就好像它们从来不存在一样。
但至少其中一个具有影响:
 "use strict";

这是一个JavaScript指令的含义。

来自EcmaScript规范:

使用严格指令是指在指令前言中的表达语句,其字符串字面量可以是代码单元序列"use strict"'use strict'

还要注意,在指令前言中使用其他字符串字面量时,可能会有特殊含义:

实现可能为不是使用严格指令并出现在指令前言中的表达式语句定义实现特定的含义。


这是一个指令字面量语句,而不是字符串字面量表达式 - 请尝试在 https://astexplorer.net/ 中输入它。 - joews
请注意,自ES3.1以来,已经添加了严格模式:http://jaoo.dk/dl/jaoo-aarhus-2008/slides//PratapLakshman_ECMAScript31.pdf(在ES4之后)。 - user5066707
1
@joews,我认为这只是一个用词问题。EcmaScript规范将其称为指示前言中表达式语句的字符串字面量。 - trincot
知道这点很好。我是根据Babylon使用的AST节点类型(DirectiveLiteral)与普通字符串字面量(StringLiteral)之间的区别来进行的。 - joews

5

这只是一个表达式语句,它评估一个值 - 没有副作用 - 并被丢弃。

如果您在eval或REPL中尝试,您可以看到它是语句的结果。


1

这些值存储在内存中,直到垃圾收集器清除它们,因为没有任何东西指向该内存位置。


我不认为垃圾回收器与此有关。你有参考资料吗?如果引擎已为此生成字节码,我认为用于评估表达式的内存会被立即释放。 - trincot

0

由于该值未被存储(即没有分配空间来保存您的文字),因此浏览器基本上会忽略它,垃圾回收器也不会有额外的开销。至少您的代码功能不会改变。当然,您的JavaScript文件会稍微大一点,因为它包含了更多(无用的)文本。


0

它似乎将它们视为插入到空白处的变量。无论如何,它都将它们视为不存在。试一下:

function myFunction() {
  "comment"
  //Or comment
  alert("hello");
}
<html>

<body>
  <button onclick="myFunction()">Call Javascript</button>
</body>

</html>

正如您所看到的,当空字符串存在时,没有发生任何事情。这是一个有趣的问题,因此我非常希望听到任何其他的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接