我读了一本关于功能声明的书。代码是这样的。
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的概念是脚本是逐行执行的,函数应该在调用之前声明。
那是不对的。在JavaScript中,执行上下文中的所有函数声明在进入该执行上下文之前,在执行任何逐步代码之前进行处理。因此,函数中的函数声明在被调用时进入函数时被处理,并且在执行任何全局逐步代码之前处理全局作用域中的函数声明。这有时被称为“提升”(因为函数声明被有效地“提升”[提升]到它们声明的范围的顶部)。 (附注:var
也悬挂在我的博客上:Poor misunderstood var
。)
这与函数表达式不同,函数表达式与所有表达式一样,在逐步执行代码时进行评估。
这是一个函数声明:
function foo() { }
这里有三个函数表达式,请注意,在每种情况下,它们都被用作右手值(例如,它们被分配给var或属性,传递给函数,用于包含表达式等),是什么使他们表达而不是声明:
var x = function foo() { };
obj = {
b: function bar() { }
};
doSomethingWith(function() { });
在那里,我展示了两个命名函数表达式和一个匿名函数表达式。如果您要为IE8及更早版本编写代码,您可能希望避开命名函数表达式,因为IE的“JScript”解释器会弄错它们;更多(也是我的博客):Double take。
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。我希望这能给出更好的解释。