0

采取以下功能:

function createGlobalVar() {
y = "foo";
}

y //"foo"

在没有关键字“var”的情况下,这会使 ya 成为局部变量,该函数会爬上作用域链以尝试查找 y 存在的位置。在没有任何预先存在的声明的情况下,它将 y 创建为全局变量。因此,我不需要在函数末尾添加 'return y' 以使 y 存在于它之外。

现在,如果我尝试做同样的事情,但将函数表达式分配给 y,它将无法正常工作。

function createGlobalVar() {
y = function() { alert("foo!") }
}

y //"undefined"

我知道如何纠正它以使其工作:

function createGlobalVar() {
y = function() { alert("foo!") }
return y;
}
var x = createGlobalVar();

x // function() { alert("foo!") }

但我不明白为什么我必须返回全局变量,因为它分配了一个函数表达式。有什么不同?

4

1 回答 1

0

你忘了打电话给createGlobalVar你的第二个例子。将函数或非函数表达式分配给全局对象的属性没有区别——当你像以前那样编写它时会发生这种情况。

请注意,不鼓励使用这样的全局对象(除非您有非常充分的理由)。你是否在严格模式下编写了这个函数,它会在以下行抛出一个 ReferenceError y

function createGlobalVar() {
  'use strict';
  y = function() { alert("foo!") };
}
createGlobalVar();

>> ReferenceError: y is not defined

您始终可以将函数转换为 setter(为其上下文对象属性分配一些值)或老式单词定义中的函数(即实际上返回一些有意义值的代码片段)。

于 2013-09-15T18:53:38.003 回答