它是一个在javascript中返回另一个函数的好方法吗?

时间:2013-01-25 08:13:39

标签: javascript function return

当阅读一些javascript源代码时,我发现下面的代码:

var fullname = function(){
     var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
        return function(name){
          return shorts[name] || name;
      }
 }();

通过返回另一个函数更有效还是其他原因? 为什么不使用:

    function fullname(name){
         var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
         return shorts[name] || name; 
  }

2 个答案:

答案 0 :(得分:2)

这相当于

var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };

function fullname(name){
      return shorts[name] || name;
}

......它的作用。但是

var fullname = function(){
     var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
        return function(name){
          return shorts[name] || name;
      }
 }();

...确保散列/对象shorts仅为* 私有仅限于函数fullname *

所以回答你的问题,为什么不呢

  function fullname(name){
         var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
         return shorts[name] || name; 
  }

下面' shorts隐藏在fullname内,但正如Dogbert指出的那样,它的速度较慢 因为哈希shorts在每次调用时创建的

但是这给了两个世界的好处:

var fullname = function(){
     var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
        return function(name){
          return shorts[name] || name;
      }
 }();

shorts仍然私有fullname 同时,shorts仅实例化一次,因此性能将会如此 也很好。

这就是他们所谓的 IIFE (立即调用函数表达式)。这个想法是 在函数A中创建函数B并声明用于函数A的变量 在函数B;范围内,只有函数A才能看到它们。

 var B = function(){
    // this is B
    // 
    val foo = {x:1}; // this is ONLY for A

    val A = function(arg0) {
       // do something with arg0, foo, and whatever
       // and maybe return something
    };

    return A;
 };

 val A = B();

如您所见,这与

相同
 var A = (function(){
    // this is in 'B'
    // 
    val foo = {x:1}; // this is ONLY for A

    return function(arg0) { // this is in A
       // do something with arg0, foo, and whatever
       // and maybe return something
    };

 })(/*calling B to get A! */);

在功能方面,这与

完全相同
 val foo = {x:1};  // foo is visible OUTSIDE foo!

 val A = function(arg0) {
    // do something with arg0, foo, and whatever
    // and maybe return something**strong text**
 };

我没有看到任何其他用途。 所以它只是一种保持变量私有的方式,而同时, 没有失去表现。

(见What is the (function() { } )() construct in JavaScript?

答案 1 :(得分:0)

在另一个函数中返回一个函数会导致创建一个闭包。在这种情况下,内部函数将可以访问外部函数作用域,其中包括对象shorts