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

Sai*_*udo 2 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 
   };
 });
Run Code Online (Sandbox Code Playgroud)

正如我在上面标记的那样,当我从.change()函数调用它时,UpdateElfDisplay函数工作正常,但如果我在加载文档时尝试调用它,则会得到"未定义".有人可以解释原因,或者指导我描述这个的资源.

I H*_*azy 5

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

如果您使用函数声明,它将被"提升"并且将起作用.

function UpdateElfDisplay () {
  // ... some work done here 
}
Run Code Online (Sandbox Code Playgroud)

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


边注

它之所以是一个类型错误,而不是一个的ReferenceError是,var UpdateElfDisplay实际上是悬挂类似于函数声明,但分配本身并没有悬挂.

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


旁注2

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

$('#Attribute1').change(UpdateElfDisplay);
Run Code Online (Sandbox Code Playgroud)