Javascript 声明前在作用域中的函数

Javascript 声明前在作用域中的函数,javascript,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.inne

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

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,表明internal()函数在声明之前就存在于作用域中。我对javascript的概念是,脚本逐行执行,函数应该在调用之前声明

问题是内部函数如何在声明之前存在于作用域中

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

那是不对的。在JavaScript中,执行上下文中的所有函数声明都是在进入该执行上下文时,在执行任何分步代码之前进行处理的。因此,在函数被调用时,函数中的函数声明在进入函数时被处理,全局范围内的函数声明在执行任何全局分步代码之前被处理。这有时被称为“提升”(因为函数声明被有效地“提升”[提升]到它们所声明的范围的顶部)。(旁注:
var
也被提升,更多信息请访问我的博客:)

这与函数表达式不同,函数表达式与所有表达式一样,在代码的逐步执行中进行计算

下面是一个函数声明:

function foo() { }
这里有三个函数表达式,请注意,在每种情况下,它们都被用作右边值(例如,它们被分配到变量或属性,传递到函数,在包含表达式中使用,等等),这使它们成为表达式而不是声明:

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

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

JavaScript在两遍中执行一个函数,考虑如下:

有两种方法可以使用函数

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.
1st:函数庸医(num){

对于(var i=0;i)您的概念是错误的。另外,问题是什么?@Jon:更新的问题..这可能会回答您的问题:这可能也有帮助:
 function quack(num){
          for(var i=0; i<num ; i++)
           {
            console.log("quacking")
           }
          }