声明范围内的功能

时间:2013-04-08 11:00:23

标签: javascript

我读了一本关于功能声明的书。代码是这样的。

function outer(){
    assert(typeof inner === "function", "inner() in scope before declaration");
    function inner(){}
    assert(typeof inner === "function", "inner() in scope after declaration");
    assert(typeof window.inner === "undefined", "inner() undefined in global space")
}

当运行测试时,所有三个语句都被置为true,表明在声明之前,inner()函数存在于作用域中。我关于javascript的概念是脚本是逐行执行的,函数应该在调用之前声明。

问题是内部函数在声明之前如何存在于范围内?

2 个答案:

答案 0 :(得分:1)

  

我对javascript的概念是脚本是逐行执行的,函数应该在调用之前声明。

这是不正确的。在JavaScript中,执行上下文中的所有函数声明在进入任何执行上下文之前,在执行任何分步代码之前进行处理。因此,函数中的函数声明在被调用时进入函数时被处理,并且在执行任何全局逐步代码之前处理全局作用域中的函数声明。这有时被称为“提升”(因为函数声明被有效地“提升”[提升]到它们声明的范围的顶部)。 (附注:var也在我的博客上提升,Poor misunderstood var

这与函数表达式不同,它与所有表达式一样,在逐步执行代码时进行评估。

这是一个函数声明:

function foo() { }

这里有三个函数表达式,请注意,在每种情况下,它们都用作右侧值(例如,它们被分配给var或property,传递给函数,使用在包含表达式等)中,这是使它们成为表达式而不是声明的原因:

var x = function foo() { };
obj = {
   b: function bar() { }
};
doSomethingWith(function() { });

我已经展示了两个名为的函数表达式和一个匿名函数表达式。如果您要为IE8及更早版本编写代码,您可能希望避开命名的函数表达式,因为IE的“JScript”解释器会弄错它们;更多(也是我的博客):Double take

答案 1 :(得分:0)

Javascript在两个Pass中执行一个函数,请考虑这个:

有两种方法可以使用功能

1st: function quack(num){
      for(var i=0; i<num ; i++)
       {
        console.log("quacking")
       }
      } - this is a function declaration.   

2nd:   var fly = function(num){
        for(var i=0; i<num ; i++)
        {
         console.log("Flying!!!")
        }
       } - This is a function expression.

现在在第一遍中,javascript寻找功能声明
    

 function quack(num){
          for(var i=0; i<num ; i++)
           {
            console.log("quacking")
           }
          } 

因此它为变量分配了嘎嘎的引用       它的名称与方法的名称相同,即嘎嘎。       因此,如果在声明之前调用quack(),它就可以正常工作。

然而在第二遍中,它寻找的函数表达式为   意味着你无法在评估之前调用fly。   我希望这能给出更好的解释。