JavaScript是否会重新创建返回后的函数

时间:2013-02-28 08:56:52

标签: javascript

以下代码:

a = function(b) {

    return alfa() + b;

    function alfa() {
        return 7;
    }
}

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

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

4 个答案:

答案 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; 
  }
})();