【问题标题】:Can somebody explain the scope issue I have with this Javascript? [duplicate]有人可以解释我在使用这个 Javascript 时遇到的范围问题吗? [复制]
【发布时间】:2012-10-04 17:52:03
【问题描述】:

可能重复:
JavaScript: var functionName = function() {} vs function functionName() {}

我有一些 Javascript,除了这个我可以从某些区域调用但不能从其他区域调用的函数之外,它大部分都可以工作。这似乎是一个范围问题,但我不知道为什么。

$().ready(function () {
   UpdateElfDisplay(); // <--- Undefined

   $('#Attribute1').change(function () {
      UpdateElfDisplay();  // <--- Works just fine.
   });

   var UpdateElfDisplay = function () {
      // ... some work done here 
   };
 });

正如我在上面所标记的,当我从 .change() 函数调用 UpdateElfDisplay 函数时它工作正常,但如果我在加载文档时尝试调用它,我会得到一个“未定义”。有人可以解释原因,或将我引导到描述此的资源。

【问题讨论】:

  • 尝试在第一次调用之前移动 UpdateElfDisplay 函数声明。
  • @epascarello - 嗯。我明白为什么有些人可能会认为这是一个重复的问题,因为现在看起来答案是一样的。但是,我认为这个问题是完全不同的。例如,“天空是什么颜色的?”和“海洋是什么颜色的?”可能有相同的答案,但不是重复的问题。
  • 答案相同,只是提问方式不同。大声笑
  • 是的。我想我是说最终的问题和答案是相同的,但在我看到答案之前,问题对我来说似乎并不相同......如果这有任何意义的话。

标签: javascript jquery scope


【解决方案1】:

您在定义之前调用了该函数,因此它不起作用。处理程序中的那个是稍后调用的,所以它可以工作

如果您使用函数声明,它将被“提升”并且可以工作。

function UpdateElfDisplay () {
  // ... some work done here 
}

JavaScript 解释器在评估任何表达式之前评估函数的声明形式。


旁注

它是 TypeError 而不是 ReferenceError 的原因是 var UpdateElfDisplay 实际上是像函数声明一样被提升,但是 assignment 本身没有被吊起。

这意味着变量存在,但它还没有你指定的值。


旁注 2

您的处理程序可能会这样重写:

$('#Attribute1').change(UpdateElfDisplay);

【讨论】:

  • 嗯,实际上 .change 处理程序还有更多工作要做,我只是将其缩写以展示我的问题。但是你的答案现在很清楚了。谢谢。
  • @SailingJudo:不客气。
【解决方案2】:
var UpdateElfDisplay = function () {

直到这一行,UpdateElfDisplay 还没有被初始化。

【讨论】:

  • 这个答案当然是完全正确的,我给了它一个+1。所选答案包含更多有用的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多