在JavaScript中编写循环检查时,如何避免在定义这些功能之前使用它们?

时间:2018-10-29 00:35:16

标签: javascript function circular-reference

在这些循环中,我一直在寻找自己,我在这些循环中通过用户输入来确保自己得到了期望的结果。但是,我不知道如何在未定义函数的情况下调用它,这给我造成了错误:no-use-before-define

PB = list(filter(lambda x: '1' not in x, PB))
LB = list(filter(lambda x: '1' not in x, LB))

无论我定义这两个函数的顺序如何,其中一个都会在定义之前调用另一个函数。

这在语法上似乎是有效的,但是鉴于eslint错误,如果我希望避免该错误,我还可以使用其他模式吗?

2 个答案:

答案 0 :(得分:1)

尽管两个函数可以互相调用可能会更好,但您最好使用while循环来保持清晰(这就是它的目的)并遵守编码标准,从而完全避免错误,像这样:

function getInput() {
    var no_valid_input = true;
    var input = null;
    while (no_valid_input) {
        input = askForInput();
        if (input !== 'bad') {
            no_valid_input = false;
        } else {
            alertBadInput();
        }
    }
    processInput();
}

工作示例:

function processInput() {
    return alert('Yep, processing...');
}
function alertBadInput() {
    return alert('Nope');
}
function askForInput() {
    return prompt('What?');
}

function getInput() {
    var no_valid_input = true;
    var input = null;
    while (no_valid_input) {
        input = askForInput();
        if (input !== 'bad') {
            no_valid_input = false;
        } else {
            alertBadInput();
        }
    }
    processInput();
}

getInput();

答案 1 :(得分:1)

禁用错误

虽然它并没有真正解决问题,但对于特定用例禁用它可能是有意义的。

// eslint-disable-next-line no-use-before-define

像这样使用它:

function tryAgain(){
  alertBadInput();
  // eslint-disable-next-line no-use-before-define
  getInput();
}

function getInput(){
  var input = askForInput();
  if (input === 'bad') {
    tryAgain();
    return;
  }
  processInput(input);
}

用例

我不得不在具有类的模块中使用它,我不想在其中公开特定于类的函数(格式与以下代码类似)。翻转类和函数会产生相同的 eslint 错误。

要么是:

  • prepareRequest 之前,其中 Requestprepare 使用,或
  • Requestprepare 之前,其中 prepareRequest 使用。

这显然是一种简化,但为您提供了总体思路:

// function that I don't export
function prepare(request) {
    // eslint-disable-next-line no-use-before-define
    if (request instanceof Request) {
        return JSON.stringify(request.obj)
    } else {
        return new TypeError('Wrong type given, expected Request')
    }
}

// class that export that uses the prepare function
class Request{
    constructor() {
        this.obj = {}
    }
    
    doSomething() {
        const request = prepare(this)
        // do something with request
    }
    
    addX(x) {
        this.obj.x = x
    }
}

module.exports = Request