Javascript 函数声明和闭包

Javascript function declarations and closures

这是关于 Javascript 和 Node.js 的一般性问题。假设我有一个函数如下:

function outer(a,b){
    function inner(){
        console.log(a[b]);
    }
    inner();
}

外层函数会被多次使用,它有这样的参数,因为我不想使用全局变量。 每次调用外层函数都会声明内层函数吗? 如果每次都声明,有没有办法不使用全局变量让代码更高效?

函数 inner 将在您每次调用 outer 时声明 我想你可以写

function outer(a,b){
    console.log(a[b]); 
}

而且没有全局变量。

如果不使用静态(在 JS 情况下是全局)变量,函数每次都会被声明。这里的方法是制作一个封装功能的对象:

var AnObject = function(a,b) {
    this.a = a;
    this.b = b;
    this.foo = function() {
       return this.a[this.b];
    };
};

function outer(a,b) {
    var inner = new AnObject(a,b);
    console.log(inner.foo());
}

我希望我理解了你的问题,代码太简单了,无法假设更多你想要的东西。

Will the inner function be declared every time I call the outer function?

是的。然而,这并不是真的那么低效,而且引擎优化得很好。

If it is declared everytime, is there a way to make the code more performant without using global variables?

不要让您的代码过于复杂。如果它像当前编写的那样工作并且可维护,请保持原样。 outer 可能会经常被调用很多次,但除非它是一条非常热门的路径,并且您确实通过基准测试将其确定为性能瓶颈,否则无需采取任何措施。过早的优化是万恶之源。

但是回到你的问题:是的,有一种方法可以避免在不使用全局变量的情况下重新创建函数。只需将 inner 需要的值作为参数传递给每个调用:

function inner(a,b){
    console.log(a[b]);
}
function outer(a,b){
    inner(a,b);
}

假设内部函数没有分配给闭包变量,这很好。

如果您想避免将 inner 放在全局范围内,只需使用 module pattern 来创建 outer