4

以下代码:

a = function(b) {

    return alfa() + b;

    function alfa() {
        return 7;
    }
}

console.log(a(4));
console.log(a(5));

是否在每次调用 a() 时创建函数 alfa()?

4

4 回答 4

5

是的,它会的。

函数声明和声明的变量var都在函数调用时被提升。这意味着,无论在函数上下文中的何处声明函数声明,从技术上讲,它始终是预先声明的。

a = function(b) {
    return alfa() + b;

    function alfa() {
        return 7;
    }
}

技术上会变成

a = function(b) {
    function alfa() {
        return 7;
    }

    return alfa() + b;
}
于 2013-02-28T08:57:50.570 回答
2

是否在每次调用 a() 时创建函数 alfa()?

每次都会创建一个新的函数对象,是的,并绑定到不同的执行上下文(因此它可以访问创建时b传入的值;是调用上下文的“闭包” ,其中它被创造了)。aalfaa

一个智能的 JavaScript 引擎(如 V8)可以很好地重用底层代码,但每次都会创建一个不同的对象。

于 2013-02-28T08:58:33.503 回答
1

是的,它会的。每次调用时,都会创建a一个新的实例。alfa

顺便说一句,在这种情况下,关闭alfa 上下文a。这就是我们所说的闭包,它允许我们在不同调用之间的函数中保持状态。

于 2013-02-28T09:02:02.283 回答
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; 
  }
})();
于 2013-02-28T09:02:39.770 回答