ECMAScript 6引入了该let
声明
我听说它被描述为“局部”变量,但是我仍然不太确定它的行为与var
关键字的不同。
有什么区别?什么时候应该let
用完var
?
主要区别是作用域规则。用var
关键字声明的变量的作用域为立即函数主体(因此作用域为函数),而let
变量的作用域为由表示的立即 封闭 块{ }
(因该块作用域)。
function run() {
var foo = "Foo";
let bar = "Bar";
console.log(foo, bar);
{
let baz = "Bazz";
console.log(baz);
}
console.log(baz); // ReferenceError
}
run();
将let
关键字引入语言的原因是函数范围令人困惑,并且是JavaScript中错误的主要来源之一。
看一下另一个stackoverflow问题的示例:
var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}
My value: 3``funcs[j]();
由于匿名函数绑定到同一变量,因此每次调用时都会输出到控制台。
人们必须创建立即调用的函数以从循环中捕获正确的值,但这也很麻烦。
尽管用var
关键字声明的变量被“提升”到块的顶部,这意味着即使在声明它们之前,也可以在其封闭范围内访问它们:
function run() {
console.log(foo); // undefined
var foo = "Foo";
console.log(foo); // Foo
}
run();
let
变量必须在定义定义后才能初始化。在初始化之前访问它们会导致ReferenceError
。从块的开始直到初始化处理之前,变量都处于“临时死区”中。
function checkHoisting() {
console.log(foo); // ReferenceError
let foo = "Foo";
console.log(foo); // Foo
}
checkHoisting();
在顶层let
,与不同var
,不会在全局对象上创建属性:
var foo = "Foo"; // globally scoped
let bar = "Bar"; // globally scoped
console.log(window.foo); // Foo
console.log(window.bar); // undefined
在严格模式下,var
将在let
引发SyntaxError的同时让您在同一范围内重新声明相同的变量。
'use strict';
var foo = "foo1";
var foo = "foo2"; // No problem, 'foo' is replaced.
let bar = "bar1";
let bar = "bar2"; // SyntaxError: Identifier 'bar' has already been declared
苹果Swift语言中的和有什么区别? 在我的理解中,它是一种编译语言,但它不会在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,难道不是生产环境的问题吗?
本文向大家介绍说下var、let和const有什么区别?相关面试题,主要包含被问及说下var、let和const有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 var定义变量,let定义常量,const定义变量。 var存在变量提升,let和const不存在变量提升 let,const部分说反了吧...
问题内容: 我在此阅读了bash手册页,但我不了解其中的区别。我对它们进行了测试,它们似乎产生了完全相同的结果。 如果未通过命令行参数设置值,我想设置变量的默认值。 上面的代码回显if 为null并回显if不为null的值。这样: 根据Bash手册页, 使用默认值。如果参数未设置或为null,则替换单词的扩展名。否则,将替换参数的值。 分配默认值。如果参数未设置或为空,则将单词扩展指定给参数。然后
问题内容: 我不知道是什么样的区别,并在 ES6 。两者都是块作用域的,如以下代码中的示例所示: 在ES5中,输出为: 但是在ES6中它将是: 我想知道为什么 ES6 允许更改值,问题是为什么我们现在应该使用’const’?我们可以用“ let”代替吗? 注意 :jsbin可以用于测试,选择 JavaScript 运行 ES5 代码,并选择 Traceur 使用 ES6 功能运行它。 问题答案:
本文向大家介绍Javascript中的var functionName = function(){}和function functionName(){}有什么区别?,包括了Javascript中的var functionName = function(){}和function functionName(){}有什么区别?的使用技巧和注意事项,需要的朋友参考一下 functionDisplayOne
Kotlin中的和有什么区别? 如本链接所述: 只读属性声明的完整语法与可变属性声明的不同之处在于两个方面:它以val而不是var开头,并且不允许setter。 但就在前面有一个使用setter的示例。 为什么我们两者都需要? 这不是Kotlin中变量的重复,与Java的区别:“var”vs.“val”?因为我询问的是与文档中的特定示例相关的疑问,而不仅仅是一般性的疑问。