【问题标题】:Javascript function declarations and closuresJavascript函数声明和闭包
【发布时间】:2015-12-03 08:31:20
【问题描述】:

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

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

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

【问题讨论】:

  • 你没有返回内部函数是吗?为什么不直接拨打console.log
  • 您是只想执行内部函数,还是关心返回它/保存它以进行异步调用?
  • 我想从内部函数返回值。'a' 和 'b' 原本是全局变量,但现在我意识到有时需要更改值才能使 'inner' 正常工作。 - 不希望 'a' 和 'b' 全局更改,所以我将它包装在一个外部函数中。现在我担心性能。

标签: javascript node.js functional-programming closures


【解决方案1】:

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

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

并且没有全局变量。

【讨论】:

  • 你必须假设代码console.log不存在,而是一个更复杂的代码。
【解决方案2】:

不使用静态(在 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());
}

我希望我理解你的问题,代码太琐碎,无法假设更多你想要的。

【讨论】:

  • 谢谢!这就是我要找的。​​span>
  • 天哪?!现在,您不仅要创建一个函数,而且每次调用 outer 时都会创建一个对象一个函数。
  • 我刚刚使用铬引擎进行了内存检查,调用了外部 10000 次。当内部函数在外部函数内部定义时,它假定您需要一个内联函数(如 C++ 中的内联函数)。如果您在调用之外定义对象,则您正在使用引用,并且与相关代码相比,编译器的工作量较小。
  • 我一直在寻找一种封装代码的好方法,这样它就可以兼具高性能和功能性。对象是要走的路。 :D
【解决方案3】:

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

是的。但是,这并不是真的那么低效,并且已经被引擎很好地优化了。

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多