- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此段出自书JavaScript: The Definitive Guide, 6th edition , 第 58 页:
When any identifier appears by itself in a program, JavaScript assumes it is a variable and looks up its value. If no variable with that name exists, the expression evaluates to the
undefined
value. In the strict mode of ECMAScript 5, however, an attempt to evaluate a nonexistent variable throws a ReferenceError instead.
首先,让我解释一下我是如何解释该段落中使用的一些短语的。
“...标识符在程序中单独出现,...”:
我假设作者的意思是标识符被解析为表达式的情况(在这种情况下执行标识符解析)。例如:
function func ( arg ) {
var local = helper( arg );
}
这里的func
、arg
(出现了两次)、local
、helper
都是标识符,但是只有 helper
和 arg
(仅在其第二次出现!)是表达式。因此,只有这两个标识符会导致引用错误。
“...不存在具有该名称的变量...”和“不存在的变量”:
我假设,作者是指一个评估为无法解析的引用的标识符。
现在,如果我错了,请纠正我,但是...
当解析为表达式(准确地说是 PrimaryExpression
)的标识符被求值时,将执行标识符解析。此过程的结果始终是 Reference 类型的值。换句话说,标识符将计算为一个引用。
引用有一个基值和一个引用名称。引用的名称是标识符的文本,基值是具有该名称绑定(bind)的环境记录(包含此类变量的范围)。但是,如果标识符解析无法解析引用的名称,则引用的基值将为 undefined
值。
因此,一个“不存在的变量”计算为一个基值为undefined
的引用。
注意一个不存在的变量的计算如何不会抛出引用错误。当解释器检索引用的值时(通过 GetValue()
)稍后会抛出错误。然而,这可能并不总是发生 - 例如,如果 x
评估为无法解析的引用,则 typeof x
将不会检索引用的值,因此,引用不会抛出错误。
我的问题开头引用的段落指出,在非严格代码中,不存在的变量求值为 undefined
,而在严格代码中,此类标识符的求值会引发引用错误。我相信这两个陈述都是不正确的 - 一个不存在的变量评估为基值为 undefined
的引用,并且在严格模式下不会抛出引用错误。
当解释器试图检索此类引用的值时(这可能发生也可能不发生取决于标识符出现在其中的“外部”表达式或语句),引用错误是抛出。此行为在非严格模式和严格模式之间没有不同。
那么,该段落是否正确?如果不正确,我是否正确识别了错误? (另外,如果我的文中有错误,请指正。)
最佳答案
在非严格代码中,“不存在的变量”是否计算为“未定义”值?
> foo;
ReferenceError: foo is not defined
> var x = foo;
ReferenceError: foo is not defined
这种行为在严格模式下也是正确的:
> (function () { "use strict"; foo; }());
ReferenceError: foo is not defined
> (function () { "use strict"; var x = foo; }());
ReferenceError: foo is not defined
我所知道的严格模式和非严格模式在变量解析方面的唯一区别是,当赋值一个变量时,如果变量没有声明,严格模式会抛出一个ReferenceError模式,但是在非严格模式下,会隐式创建一个全局变量。
Annex C (The strict mode of ECMAScript):
Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global object. When a simple assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable Reference. If it does a ReferenceError exception is thrown (8.7.2).
关于javascript - "nonexistent variable"是否在非严格代码中计算为 "undefined"值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754801/
最近我遇到了 AngularJS Strict DI 模式。使用它的目的和好处是什么?通过在移动设备上使用它,我们会获得显着的性能提升吗? 我尝试将它应用到我的代码中,并且在编写代码时我没有做任何注释
要在复制文本的底部添加额外信息 - 我想使用以下 JS: document.addEventListener('copy', (event) => { const pagelin
Java 是否有一个好的、严格 的日期解析器?我可以访问 Joda-Time,但我还没有看到这个选项。我发现了“Is there a good date parser for Java”这个问题,虽然
在下面的网页中,图像和 div 之间有几个像素的间隙。 (我已经在 Firefox 3 和 Safari 4 中测试过。) 我怎样才能缩小差距? body { background-color:
前段时间我遇到了一个“问题”,但我一直没有弄清楚。希望有人能照亮它。当我将 DOCTYPE 从严格更改为过渡时,是什么导致某些浏览器(Chrome、Opera 和 Safari)以不同方式呈现页面。我
PHP 以其类型杂耍而闻名。我必须承认这让我很困惑,而且我很难在比较中找出基本的逻辑/基本内容。 例如:如果 $a > $b 为真且 $b > $c 为真,是否意味着 $a > $c总是也是真的吗?
有在ECMAScript Language Specification11.9.1 等于运算符 (==): NOTE 3 The equality operator is not always tra
考虑这些不同的尝试,比如 last : Prelude> import Data.Foldable Prelude Data.Foldable> foldr const undefined (reve
我正在考虑使用 jQuery 元数据插件。看起来很有趣,但是... ... alert($('li.someclass').metadata().some); 这段代码有效吗? 更新 当然这是一个老例
我有一个 CSS 文件,我的本地开发服务器(webpack)正在提供一个显然错误的 mime 类型。 Refused to apply style from 'http://localhost:100
因此对于 Google Chrome 和 Opera,cookie 具有 SameSite 属性,该属性可以具有以下两个值之一:strict 或 lax。 它们之间的一些区别之一是 SameSite=
我试图到处寻找这个问题的答案,但似乎我运气不好。 我有一个非常简单的 Mongoose 模型 var userObject = { profile: { username: {
我正在为必须使用 XHTML 1.0 Strict 进行验证的类编写程序。根据 w3 的验证程序,我的页面通过了验证。我还有一个 HTML5 版本(这是原始版本),它可以按应有的方式进行验证和工作。
我得到了很多 validation errors因为 在 里面。如果我删除 br 标签,那么它工作正常。 为什么会产生问题? 最佳答案 不是br在p里面,而是你没有结束 br与 /特点。你有 在代码中
好吧,这让我抓狂。 我想在我的文档周围加上边框。它应该很好地绕过整个窗口/视口(viewport)。所以我定义: body { border: 1px solid red; } 当我的文档处于 q
我在 MySql 服务器上运行的查询遇到问题。这是查询: SELECT itms.Gender,itms.Age, (CASE WHEN (plv.Discount = 0 OR t1.EverGre
我有以下 javascript 函数,如果所有必填字段都不完整并且是我使用 Google Apps 脚本创建的表单的一部分,它会阻止表单提交。请注意,#submitbutton 实际上是一个常规按钮,
我是一名优秀的程序员,十分优秀!