摩卡:在`this`上设置varibles是反模式?

时间:2017-11-21 18:51:44

标签: javascript mocha

我对以下两段代码感到困惑:

代码1:

#include <stdio.h>
#include <math.h>

int main(void) {
    int a, b, br=0, i, j, brojac=0, y;
    scanf("%d %d", &a, &b); 
    int p[b-a];
    for(i=a; i<=b; i++){
        p[br]=i;
        br++;
    }

    for(i=0; i<br; i++){
        y=p[i];
        for(j=1; j<= (int) sqrt(p[i]); j++){
           if(y%j == 0){
               printf("\n%d", p[i]);
               brojac++;
               break;
           }
        }
    }

    printf("\n%d", brojac);
    return 0;
}

码2:

describe('suit', function(){
    before(() => {
        this.suitData = 'suitdata';
    });

    beforeEach(() => {
        this.testData = 'testdata';
    });


    it('test', done => {
         console.log(this.suitData)// => suitdata
         console.log(this.testData)// => testdata
    })
});

哪一个更好,code1还是code2?我认为code1是一种反模式。我是对的吗?

由于

1 个答案:

答案 0 :(得分:2)

我不会使用this来存储值。

摩卡价值观与您之间发生冲突的风险

this上下文已经包含一些由Mocha设置的值作为其公共API(例如this.timeout)的一部分,并且有些值未正式记录但可能有用(例如this.test。如果在this上设置变量,则可能会遇到与Mocha变量的冲突。例如,如果用字符串覆盖this.timeout函数,那么如果要更改超时,则无法使用调用this.timeout。在您为自己的目的使用this.timeout的大型套件中,稍后修复冲突的成本可能很高。还有一个问题是,现在没有冲突的名称,可能在未来的Mocha版本中发生冲突。

如果你在第二个例子中使用闭包,那么就不会有任何冲突。

this

的意外行为 Boneskull是GitHub上Mocha的所有者之一,他在comment中说:

  

我强烈建议用户不要使用this来存储值。

这是在使用this存储值时显示意外结果的issue report上下文中。这是关于this的意外行为的另一个issue。在测试之间管理this的方式不是已记录的内容,因此人们会想象它会以某种方式工作,但事实并非如此。需要进行的更改需要新的主要版本的Mocha。

相反,如果您使用第二个示例中的范围,那么变量的创建和更改方式总是非常明确:a)知道JavaScript和b)阅读Mocha的文档(因为您需要了解有关订单的信息)其中运行了钩子和测试。)