2017-09-18 57 views
1

我是新來的JavaScript和我做一個小應用程序作爲一個練習反應,但我堅持一個奇怪的問題。我試圖在同一個類的另一個方法中調用一個方法,但它並不總是有效。從方法錯誤調用方法「X不是函數」

export class Core { 
constructor() { 
    this.promptList = ["Are you sure you want to proceed? [Y/n] ", 
         "Enter a username: ", 
         "Enter your email: "]; 
    this.funcList = [this.proceed, 
        this.validateUser, 
        this.validateEmail]; 

    this.currentStep = 0; 
} 

incStep(state) { 
    const newState = Object.assign({}, state, 
     {prompt: this.promptList[++this.currentStep]}); 
    return newState; 
} 

printError(state, error) { 
    console.log("error"); 
    return Object.assign({}, state, 
     {history: state.history.concat(error)}); 
} 

proceed(input, state) { 
    if (input == "Y") 
     return this.incStep(state); 
    else if (input == "n") 
     return this.printError(state, "ok bye"); 
    return state; 
} 

validateUser(input, state) { 
    return state; 
} 

validateEmail(input, state) { 
    return state; 
} 

process(input, currentState) { 
    const newState = Object.assign({}, currentState, 
     {history: currentState.history.concat(input)}); 
    return this.funcList[this.currentStep](input, newState); 
} 

}

在過程(),我稱之爲從功能列表的方法,這工作正常,但當我嘗試調用從出發incStep()()拋出一個錯誤

Uncaught TypeError: this.incStep is not a function 
at Array.proceed (http://localhost:8080/index_bundle.js:31881:34) 
at Core.process (http://localhost:8080/index_bundle.js:31898:42) 

我猜的錯誤是由於這樣的事實,「這」並不是指好對象,但我不明白究竟爲什麼在這種情況下:/

我在做什麼錯在這裏?

+0

如何調用'process()'?你如何調用'proceed()'? – bennygenel

+0

@bennygenel process()從另一個類中調用,並在我的代碼 –

+0

的最後一行調用proceed(),您應該將這些部分添加到您的問題中 – bennygenel

回答

2

由於這些部分,您的代碼失敗。

this.funcList = [this.proceed, 
       this.validateUser, 
       this.validateEmail]; 

你需要記住數組是JS speacial類型的對象,因此它是相當於

this.functList = {0:refrence of proceed, 
        1:refrence of validateUser, 
        2:refrence of validateEmail, 
        length:3 
        } 

當一個函數被稱爲對象的方法,這是這是設置爲調用該方法的對象。 所以當

this.funcList[this.currentStep](input, newState); 

被稱爲並繼續被執行,這屬於它駐留在客體,它在這種情況下是funcList陣列。

proceed(input, state) { 
if (input == "Y") 
    return this.incStep(state); 

因此,此內部繼續調用是指funclist數組而不是類並失敗。

使用綁定來設置這個是解決這個問題的一種方法。

this.funcList = [this.proceed.bind(this), 
       this.validateUser.bind(this), 
       this.validateEmail.bind(this)];