以下代码:
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
console.log(a(4));
console.log(a(5));
是否在每次调用()时都会创建函数alfa()?
答案 0 :(得分:5)
是的。
函数声明和var
声明的变量在函数调用时都被提升。这意味着,无论函数上下文中的 where ,都声明了函数声明,它在技术上总是在前面。
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
技术上将成为
a = function(b) {
function alfa() {
return 7;
}
return alfa() + b;
}
答案 1 :(得分:2)
是否在每次调用()时都会创建函数alfa()?
每次都会创建一个新函数 object ,是,并绑定到不同的执行上下文(因此它可以访问传递给{{1}的b
的值当它被创建时; a
是对创建它的alfa
调用的上下文的“闭包”。
智能JavaScript引擎(如V8)可能会重用基础代码,但每次都会创建一个不同的对象。
答案 2 :(得分:1)
是的,它会的。每次拨打a
时,都会创建alfa
的新实例。
顺便说一下,在这种情况下,alfa
会关闭 a
上下文。这就是我们所说的闭包,它允许我们在不同调用之间的函数中保存状态。
答案 3 :(得分:1)
是
您使用的语法是糖:
a = function(b) {
var alfa = function() {
return 7;
}
return alfa() + b;
}
console.log(a(4));
console.log(a(5));
每次执行alfa
时,您都会更清楚地创建和分配a
。
你也可以通过这个简单的改变来测试它:
a = function(b) {
return alfa; // let's return the function
function alfa() {
return 7;
}
}
console.log(a(4)==a(4)); // logs false
如果您想避免每次都创建alfa
,您可以这样做:
a = (function(){
var alfa = function() {
return 7;
}
return function(b) {
return alfa() + b;
}
})();