有人可以用这个Javascript来解释我的范围问题吗?

时间:2012-10-04 17:52:04

标签: javascript jquery scope

  

可能重复:
  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函数工作正常但如果我在加载文档时尝试调用它,则会得到“未定义”。有人可以解释原因,或者指导我描述这个的资源。

2 个答案:

答案 0 :(得分:5)

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

如果您使用功能声明,它将被“悬挂”并且可以正常工作。

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

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


旁注

它是 TypeError 而不是 ReferenceError 的原因是var UpdateElfDisplay实际上是悬挂类似于函数声明,但是赋值< / em>本身并未悬挂。

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


旁注2

您的处理程序可能会被重写为:

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

答案 1 :(得分:4)

var UpdateElfDisplay = function () {

在此行之前,UpdateElfDisplay尚未初始化。