以下代码:
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
console.log(a(4));
console.log(a(5));
是否在每次调用 a() 时创建函数 alfa()?
以下代码:
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
console.log(a(4));
console.log(a(5));
是否在每次调用 a() 时创建函数 alfa()?
是的,它会的。
函数声明和声明的变量var
都在函数调用时被提升。这意味着,无论在函数上下文中的何处声明函数声明,从技术上讲,它始终是预先声明的。
a = function(b) {
return alfa() + b;
function alfa() {
return 7;
}
}
技术上会变成
a = function(b) {
function alfa() {
return 7;
}
return alfa() + b;
}
是否在每次调用 a() 时创建函数 alfa()?
每次都会创建一个新的函数对象,是的,并绑定到不同的执行上下文(因此它可以访问创建时b
传入的值;是调用上下文的“闭包” ,其中它被创造了)。a
alfa
a
一个智能的 JavaScript 引擎(如 V8)可以很好地重用底层代码,但每次都会创建一个不同的对象。
是的,它会的。每次调用时,都会创建a
一个新的实例。alfa
顺便说一句,在这种情况下,关闭alfa
上下文a
。这就是我们所说的闭包,它允许我们在不同调用之间的函数中保持状态。
是的。
您使用的语法是糖:
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;
}
})();