在我的理解中,定义一个没有var关键字的变量只是评估将此变量添加到window对象。另一方面,尝试访问尚未定义的对象的成员,评估为未定义。所以我可以这样做:
> foo = "bar";
"bar"
> window.foo;
"bar"
> window.bar;
undefined
为什么直接访问时无法获得未定义的变量值(未定义)?
> bar;
ReferenceError: bar is not defined
还有一件我不太了解的事情,我认为可能是相关的。当我在控制台中输入一些文字时,他们总是评价自己。 1评估为1,[1]至[1],依此类推。我一直认为一个函数也是一个文字,因为它具有一些类似价值的特质(成为一等公民)。但是当我尝试评估匿名函数时,我收到语法错误。
> function() {}
SyntaxError: Unexpected token (
我知道我可以定义一个命名函数,但是它的计算结果是未定义的(它在某处定义函数而不是它本身)。那么为什么函数不是文字?
感谢
答案 0 :(得分:3)
关于问题的第一部分,请参阅ReferenceError and the global object。基本上,显式引用对象的不存在属性将返回undefined,因为可能存在您希望处理并恢复的情况。但是,引用一个不存在的变量永远不会发生,所以它会大声失败。
对于问题的第二部分,您试图声明一个没有名称的函数,这是不可能的。函数声明和函数表达式之间存在细微差别。函数名称是可选的函数表达式只能作为表达式的一部分出现,而不能作为语句出现。所以这些都是合法的:
var foo = function () { };
(function () { });
但不是这样:
function () { };
答案 1 :(得分:0)
如果您只是访问“bar”,则范围不明确。首先在局部范围内寻找变量(如果你在函数内部)。如果没有找到,则检查窗口对象。但是,您在逻辑上得到的任何错误都是指本地范围内不存在的“条形”。
如果要显示类似的功能,您希望显示什么?一个函数没有价值,它的声明肯定没有。你可以期望控制台能够执行一个函数并返回结果,但这也很危险。您不仅可以拥有不返回值的函数,而且函数可以包含修改其环境的代码,换句话说,在控制台中运行函数可以修改文档的当前状态和当前的Javascript状态在它。
答案 2 :(得分:0)
Javascript已被编码,如果您尝试读取对象的属性,则会得到undefined
。
但是,如果您尝试读取不存在的变量的值而不将其作为全局对象的属性引用,则会引发错误。
有人可以通过多种方式解释这个选择,但你必须采访一位原始设计师,以找出他们选择它的确切原因。好消息是,一旦您了解了行为,您就可以根据您想要的行为以某种方式对其进行编码。如果您知道可能未定义全局变量,那么您可以在其前面添加window.xxx
并检查是否未定义。
在任何情况下,如果您想测试是否存在全局变量,您可以这样做:
if (typeof bar !== "undefined")
或
if (window.bar !== undefined)
另外,要非常小心假设控制台与真正的javascript执行完全相同,因为它在很多方面都不完全相同。如果您正在测试边界行为,最好在实际的javascript执行上下文中测试它(我发现jsFiddle非常有用)。