函数声明未定义 - 为什么?

时间:2016-05-04 08:32:08

标签: javascript

我有一个相当标准的init函数传递给变量。

var initFunction = function()...

和#34;函数initFunction(){}"相同,不是吗? (内部,JavaScript也会创建一个变量)

如果我在init函数中声明了一个函数变量,并在它的声明之前调用它,那么它必须是可访问的,因为函数中的所有定义(var' s)都是在第一次初始化时。这就是我认为JS的本质。

以下代码不起作用(innerFunction未定义)

var initFunction = function(){
    if(0 == 0){
        innerFunction();
    }
    var innerFunction = function(){
        alert("Hello World");
    };
};

initFunction();

顺便说一下:用分号关闭所有功能是不错的做法?

祝你好运

2 个答案:

答案 0 :(得分:3)

此处的问题称为可变提升。当你这样做时:

var innerFunction = function(){
    alert("Hello World");
};

通话时间将为:

var innerFunction = null; // Or undefined may be.

然后在定义之后,它被定义。然而,当您用以下代码替换代码时

if (0 == 0) {
    innerFunction();
}
function innerFunction() {
    alert("Hello World");
} // Notice no semi colon.

首先定义整个函数。如果您想使用函数表达式而不是声明,则需要将定义放在调用的顶部。

现在这可行。

var initFunction = function(){
    var innerFunction = function(){
        alert("Hello World");
    };
    if (0 == 0) {
        innerFunction();
    }
};
  

使用分号关闭所有功能是不错的做法?

对于函数表达式,这是一个很好的做法。对于正常的函数声明(使用function关键字而不是匿名函数),没有必要。

答案 1 :(得分:2)

  

和#34;函数initFunction(){}"相同,不是吗? (

没有。函数声明被提升。函数表达式不是。 (你有一个函数表达式)。

您尝试在将值分配给innerFunction();之前调用innerFunction(稍后两行)。