Javascript函数声明和闭包

时间:2015-09-07 18:49:40

标签: javascript node.js functional-programming closures

这是关于Javascript和Node的一般问题。假设我有一个类似的功能:

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

外部函数将被多次使用,并且它具有类似的参数,因为我不想使用全局变量。 每次调用外部函数时都会声明内部函数吗? 如果每次都声明它,有没有办法在不使用全局变量的情况下使代码更高效?

3 个答案:

答案 0 :(得分:0)

每次拨打inner时都会声明功能outer 我想你可以写

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

并且没有全局变量。

答案 1 :(得分:0)

不使用static(在JS case global中)变量,每次都会声明该函数。这里的方法是创建一个封装功能的对象:

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

我希望我理解你的问题,代码太过微不足道,无法承担更多你想要的东西。

答案 2 :(得分:0)

  

每次调用外部函数时都会声明内部函数吗?

是。然而,这并不是那么低效,并且很好地被引擎优化了。

  

如果每次都声明它,是否有办法在不使用全局变量的情况下使代码更高效?

不要让你的代码比它需要的更复杂。如果它工作并且可以按照当前编写的方式维护,请保持原样。 outer可能经常被调用很多次,但除非它是一条非常热门的路径并且您通过基准测试确定这是一个性能瓶颈,否则无需采取行动。过早优化是万恶之源。

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

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

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

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