Advantages of using let over var within a function
假设我有一段这样的代码:
1 2 3 4 5 6 7 8 9 10 11
| const number = 3;
function fooFunction() {
let numberTwo = 5;
var answer = number + numberTwo;
return answer;
}
finalAnswer = fooFunction();
console.log(finalAnswer); |
假设使用ES2015兼容的浏览器,使用上述代码的优势/劣势将超过:
1 2 3 4 5 6 7 8 9 10 11
| const number = 3;
function fooFunction() {
var numberTwo = 5;
var answer = number + numberTwo;
return answer;
}
finalAnswer = fooFunction();
console.log(finalAnswer); |
如果两者返回相同的数字,有什么优点或缺点吗?
- 根据这个答案,它们在你的函数中是相同的。
- 从安全和性能的角度来看呢?
- 根据你上面的用法,没有区别。
- 如果在安全性或性能上存在差异,它们将不相同
- "从安全性和性能的角度看如何?"let和var的区别是范围。不是性能。
- 它只是作用域(var是函数作用域,让我们来看看块作用域)。编译器将负责提升和优化。
- 的确。不过,在我看来,let函数更安全,因为在函数之外无法访问数据。这是正确的还是不正确的?如果不是,那为什么不起作用呢?另外,起重是否会影响性能?我本以为会的。
- var是功能范围,在功能外不可见。let,作为块范围意味着它不一定在整个函数中都可见,但它们都是您的函数的局部…
- 在您的示例中,var answer在fooFunction()块之外不可用。
- 然而,var变量被提升到功能范围之外,并在全局级别上提供给解释器,而let变量则不是。是不是不对?
- 不,var被提升到功能的顶部,而不是在功能的外部。)
- 但是,如果一个let定义的变量在调用它的函数之外仍然没有初始化,这种情况似乎是这样的,那么这比var更安全,因为除了函数本身之外,任何东西都无法访问数据?
正如其他人提到的,在您的示例中,您可以交替使用let和var。区别在于let是块范围的,var不是块范围的。
例如,使用var,您可以这样做(打印"foo"):
1 2 3 4 5 6 7 8 9
| function printFoo(param) {
if (param) {
var x ="foo";
}
console.log(x);
}
printFoo("hello"); |
由于let x的作用域是if块的作用域,因此没有定义,因此不能使用let来执行此操作。
在您提供的代码示例中,这两个示例可以互换。当let派上用场时,它将范围限制为块级别,而不是功能级别。例如,在for循环的内部使用let。
值得注意的是,使用var关键字创建的变量被提升,而使用let关键字创建的变量则没有提升。
凯尔·辛普森在大卫·沃尔什的博客上对这个话题进行了详细的分析:https://david walsh.name/for and against let implicit hazards
- 从技术上讲,let变量被提升,但不可引用。见暂时死区。In ECMAScript 2015, let will hoist the variable to the top of the block. However, referencing the variable in the block before the variable declaration results in a ReferenceError. The variable is in a"temporal dead zone" from the start of the block until the declaration is processed.
- (请参见ES6中是否使用let或const声明变量?更详细的讨论)