对象功能范围

时间:2016-02-27 16:21:17

标签: javascript scope closures

factory(n)返回带有函数的对象。 func1函数定义创建自己的范围,此函数中的x引用x = n + ''。 但func2是一个参考,范围是错误的。

有没有办法从create返回一个对象,所以它的函数是引用(不是单独的定义)?

实际上,我对func1方法很好,而函数定义占用空间很小。如果它是一个复杂的函数,最好不要将此函数克隆到来自factory(n)的每个对象中。 inner_func可能不会使用this,这是一项简单的功能。另外,我想避免newthis

var factory = (function(){
  var x = '!';

  return function create(n){
    var x = n + '';
    return {
      func1: function(y){return inner_func(x, y); },
      /* vs */
      func2: inner_func_api
    }
  }

  function inner_func_api(y){ return inner_func(x, y); }

  function inner_func(a, b){ return a + b; }

}());

var f1 = factory(2);
var f2 = factory(3);

var f1_func1 = f1.func1(4);
var f2_func1 = f2.func1(5);

var f1_func2 = f1.func2(4);
var f2_func2 = f2.func2(5);

console.log(f1_func1, f2_func1); //24 35
console.log(f1_func2, f2_func2); //!4 !5

1 个答案:

答案 0 :(得分:0)

可以return语句中的对象初始值设定项分开定义该函数:

var factory = (function(){
  var x = '!';

  return function create(n){
    var x = n + '';

    function func1(y) {
      return inner_func(x, y);
    }

    return {
      func1: func1,
      /* vs */
      func2: inner_func_api
    }
  }

  function inner_func_api(y){ return inner_func(x, y); }

  function inner_func(a, b){ return a + b; }

}());

但是,它没有实际意义,并且功能的大小或复杂程度并不重要。函数实例占用空间,但函数的代码是常量(不可变),并且不需要是从同一源代码创建的每个Function对象的一部分。