2016-02-27 170 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; } 

}()); 

但是,它並沒有實際的區別,它並沒有多麼大的或複雜,功能是。函數實例佔用空間,但函數的代碼是常量(不可變的),並且不需要成爲從同一段源代碼創建的每個函數對象的一部分。