函数在声明之前

问题描述:

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

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") 
} 

当测试运行所有三个语句都被断言属实,表明内()函数中存在范围的声明之前。我关于JavaScript的概念是脚本逐行执行,并且在调用之前应该声明函数。

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

+0

你的概念错了。另外,问题是什么? – Jon 2013-04-08 11:01:21

+0

@Jon:更新的问题.. – 2013-04-08 11:02:49

+1

这可能会回答你的问题:http://stackoverflow.com/questions/7506844/javascript-function-scoping-and-hoisting – tpbowden 2013-04-08 11:03:23

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

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

这是从功能不同表达式,它像所有的表情,都在一步一步的执行代码的评估。

这里是一个函数声明:

function foo() { } 

这里有三个函数表达式,请注意,在每种情况下,他们作为右手值(例如,他们分配到VAR或财产,传递给函数,在含有表达式中使用,等等),这是什么让他们的表达,而不是声明:

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

有我显示了两个命名为本功能离子表达式和一个匿名函数表达式。如果您打算为IE8及更早版本编写代码,您可能需要避开命名为函数表达式,因为IE的“JScript”解释器会导致错误;更多(也是我的博客):Double take

的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. 

现在先通过JavaScript的查找函数声明
这是

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

因此,它将庸医的参考指定给变量 w这个名字与方法的名字相同,也就是嘎嘎。 因此,如果你在声明它之前调用quack(),它可以正常工作。

但是在第二遍中,它寻找函数表达式,其中
表示在评估它之前不能调用fly。 我希望这能给出更好的解释。