声明范围内的功能

问题描述 投票:0回答:2

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

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的概念是脚本是逐行执行的,函数应该在调用之前声明。

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

javascript
2个回答
1
投票

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

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

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

这是一个函数声明:

function foo() { }

这里有三个函数表达式,请注意,在每种情况下,它们都被用作右手值(例如,它们被分配给var或属性,传递给函数,用于包含表达式等),是什么使他们表达而不是声明:

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

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


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的引用分配给一个与方法名称相同的变量,即嘎嘎。因此,如果在声明之前调用quack(),它就可以正常工作。

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

© www.soinside.com 2019 - 2024. All rights reserved.