2017-03-23 60 views
0

處理考慮下面的代碼,它實現了一個閉合時保持功能短:如何用瓶蓋在Javascript

function scopeDef(){ 

    var privateField_1 = 1; 
    . 
    . 
    . 
    var privateField_8 = 8; 

    return function someFunction() { 
     /* Implementation takes 10 lines, and uses the private fields */ 
    } 

} 

我想保持代碼的可讀性和公約,通過保持每個函數的代碼更短,然後讓說10個代碼行。

我需要簡單地將someFunction()的實現移動到scopeDef()之外,並且仍然能夠訪問someFunction()中的私有字段。

有沒有辦法做到這一點?

+1

任何原因,你不能scopeDef外聲明someFunction,然後給它一些參數?如果privateFields是有價值的而不是引用,那麼我認爲它會起作用。 – minorcase

+0

真正的問題應該是:你真的需要爲10行函數關閉8個變量嗎?如果您可以發佈完整的實際代碼,以便我們瞭解哪些方法可行,哪些不適用於您的情況,這將有所幫助。 – Bergi

+0

@minorcase,我想將'defScope'的調用賦值給一個變量,然後在需要的時候自行調用這個變量,同時保持這些變量,並且保持它們是私有的。 如果我在scopeDef()之外創建'someFunction(... privateVariables ..)',我看不到如何實現這個功能。 – GoldenSpecOps

回答

0

您可以使用bind來設置函數的上下文。您可以在關閉的上下文之外定義someFunction(),然後在關閉內返回someFunction.bind(this)

function publicMethod() { /* ... */ } 

function closure() { 
    /* ... */ 

    return publicMethod.bind(this) 
} 

例如

function logA() { 
    console.log(this.a); 
} 

function closure() { 
    this.a = 'context'; 
    return logA.bind(this); 
}