我读了一本关于功能声明的书。代码是这样的。
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的概念是脚本是逐行执行的,函数应该在调用之前声明。
问题是内部函数在声明之前如何存在于范围内?
答案 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。 我希望这能给出更好的解释。