2016-02-27 102 views
1

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 
+0

使用新的和原型是内置的方式来做到这一点。我知道Crockford不喜欢它。但这是语言机制来做你想做的事情。你的'func2'方法很好,并且使用引用作为函数。 – t3dodson

+0

我不完全确定你在问什么。您需要闭包来捕获状态,或者您需要传递参数。根据你实际在做什么,你可能能够使用部分应用程序,并避免*整个*重复函数,但是你仍然需要通过闭包或者params来获得你需要的状态。正如t3dodson所说,“避免”new和this有效地消除了JS的OOP功能 - 理性的放弃JS给你的东西是什么? –

+0

可能是太严格了。我想在'func1,func2,inner_func_api'内添加'this,prototype,bind,call'。至于OOP,我想尽量减少管理状态。你不觉得,代码看起来很漂亮,没有'this'和'new' :),而且更简单。正如我所说的,解决方案完成了这项工作;我只是想要一点改进,并认为我错过了这件事。 – JohnG

回答

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

}()); 

但是,它并没有实际的区别,它并没有多么大的或复杂,功能是。函数实例占用空间,但函数的代码是常量(不可变的),并且不需要成为从同一段源代码创建的每个函数对象的一部分。