【问题标题】:javascript returning functional expressions vs declaring variables within a functionjavascript返回函数表达式与在函数中声明变量
【发布时间】:2013-09-15 18:50:34
【问题描述】:

取如下函数:

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

y //"foo"

在没有关键字“var”的情况下,这将使 y 成为局部变量,该函数会爬上作用域链以尝试查找 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!") }

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

【问题讨论】:

标签: javascript scope global-variables function-expression


【解决方案1】:

在第二个示例中,您忘记致电 createGlobalVar。将函数或非函数表达式分配给全局对象的属性没有区别 - 当您像以前一样编写它时会发生这种情况。

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

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

>> ReferenceError: y is not defined

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

【讨论】:

  • 虽然这很可能是问题所在,但在第一个示例中,createGlobalVar 也没有被调用,所以两者都不应该工作。
  • 完全正确:除非实际调用该函数,否则第一个 sn-p 不会为 global.y 分配任何内容。
  • 该死的你是对的!啊,愚蠢的错误,我只需要多一双眼睛。谢谢!
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 2021-08-26
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多