Google JS编码约定 - "不得使用var关键字"

时间:2016-12-22 12:15:40

标签: javascript convention

我很难理解this paragraph

  

使用constlet声明所有局部变量。   除非需要重新分配变量,否则默认使用const。   不得使用var关键字

有人可以解释一下这意味着什么吗?为什么我不应该使用' var'关键字?

1 个答案:

答案 0 :(得分:3)

这些约定假定为ES2015及更高版本,其中letconst可用于替换var。他们说不再使用var了,因为letconst语义更有用(根据那些约定 [以及我个人的观点] ,这不重要] )。

例如,他们说不要这样做:

function foo() {
    for (var i = 0; i < 10; ++i) {
        // Do something with i
    }
}

相反,要么这样做:

function foo() {
    let i;
    for (i = 0; i < 10; ++i) {
        // Do something with i
    }
}

或者这个(但请注意,最后一个版本的性能稍差,而不是通常 1 ):

function foo() {
    for (let i = 0; i < 10; ++i) {
        // Do something with i
    }
}

同样,如果您正在使用其值永远不会更改的变量,请使用const

function getTomorrow() {
    const date = new Date();
    date.setDate(date.getDate() + 1);
    return date;
}

我们可以在那里使用const,因为date的值永远不会改变(只是它引用的对象的状态)。

如果你和我一样,当你将这些付诸实践时(我不遵循这些约定,但我确实遵循了使用letconst的具体示例),如果您正在使用其他良好做法(比如保持较小的功能等),您会对使用const而不是let的频率感到惊讶,因为您结束了很多&#34;变量&#34;你永远不想改变自己的价值观。

1 你可能想知道为什么会有性能差异

function foo() {
    let i;
    for (i = 0; i < 10; ++i) {
        // Do something with i
    }
}

function foo() {
    for (let i = 0; i < 10; ++i) {
        // Do something with i
    }
}

原因是在第二个中,为每个循环迭代创建了一个 new i变量。我们可以看到,如果我们在循环中创建一个闭包:

&#13;
&#13;
function foo1() {
    console.log("let outside the loop:");
    let i;
    for (i = 0; i < 5; ++i) {
        setTimeout(() => {
            console.log(i);
        }, 0);
    }
}
function foo2() {
    console.log("let inside the loop:");
    for (let i = 0; i < 5; ++i) {
        setTimeout(() => {
            console.log(i);
        }, 0);
    }
}

foo1();
setTimeout(foo2, 50);
&#13;
.as-console-wrapper {
  max-height: 100% !important;
}
&#13;
&#13;
&#13;

同样,性能差异几乎从不重要(并且随着引擎在可能的情况下更好地优化它们会变得更小),并且很多时候你想要第二种形式的行为(这就是它的原因)这样定义)。但它就在那里。