1

在我的理解中,定义一个没有 var 关键字的变量只是评估将此变量添加到窗口对象。另一方面,试图访问尚未定义的对象的成员,结果为未定义。所以我可以做这样的事情:

> foo = "bar";
"bar"
> window.foo;
"bar"
> window.bar;
undefined

为什么直接访问时无法获得未定义的变量值(未定义)?

> bar;
ReferenceError: bar is not defined

还有一件事我不太明白,我认为这可能是相关的。当我在控制台中输入一些文字时,它们总是对自己进行评估。1 计算为 1,[1] 计算为 [1],依此类推。我一直认为函数也是字面量,因为它具有一些类似价值的品质(成为一等公民)。但是当我尝试评估一个匿名函数时,我得到一个语法错误。

> function() {}
SyntaxError: Unexpected token (

我知道我可以定义一个命名函数,但计算结果为未定义(它在某处定义函数而不是它本身)。那么为什么不是函数字面量呢?

谢谢

4

3 回答 3

3

对于您问题的第一部分,请参阅ReferenceError 和 global object。基本上,显式引用对象不存在的属性将返回 undefined,因为在某些情况下您可能想要处理并恢复。但是,引用一个不存在的变量不应该发生,所以它会大声失败。

对于您问题的第二部分,您试图声明一个没有名称的函数,这是不可能的。函数声明和函数表达式之间存在细微差别。函数名可选的函数表达式只能作为表达式的一部分出现,不能作为语句的一部分出现。所以这些是合法的:

var foo = function () { };

(function () { });

但不是这个:

function () { };

于 2012-09-15T16:24:54.160 回答
0

如果您只是访问“栏”,则范围不清楚。首先在本地范围内寻找该变量(如果您在函数内部)。如果没有找到它,则检查窗口对象。但是你在逻辑上得到的任何错误都是指本地范围内不存在的“条”。

如果您想显示这样的功能,您希望显示什么?一个函数没有价值,它的声明当然也没有。您可以期望控制台能够执行函数并返回结果,但这也很危险。你不仅可以有一个不返回值的函数,而且,函数可以包含修改其环境的代码,换句话说,在控制台中运行一个函数可以修改文档的当前状态和当前的 Javascript 状态在里面。

于 2012-09-15T16:06:41.683 回答
0

Javascript 已被编码,如果您尝试读取对象的属性,您会得到undefined.

但是,如果您尝试读取一个不存在的变量的值,而没有将其作为全局对象的属性进行引用,则会引发错误。

可以通过多种方式解释这种选择,但您必须采访其中一位原始设计师才能确切了解他们选择它的原因。好消息是,一旦你理解了行为,你可以根据你想要的行为以一种或另一种方式对其进行编码。如果您知道全局变量可能未定义,那么您可以在它前面加上window.xxx并检查未定义。

无论如何,如果你想测试一个全局变量是否存在,你可以这样做:

if (typeof bar !== "undefined")

或者

if (window.bar !== undefined)

此外,在假设控制台与真正的 javascript 执行完全相同时要非常小心,因为它在许多方面并不完全相同。如果您正在测试边界行为,最好在实际的 javascript 执行上下文中对其进行测试(我发现 jsFiddle 对此非常有用)。

于 2012-09-15T16:23:18.387 回答