javascript中var、let、const的区别
这几天修改别人的js,发现声明变量有的用var,有的用let,那它们有什么区别呢?
javascript中声明变量的方式有:var、let、const
1.var
(1)作用域:
整个函数范围内,或者是全局的
function func() {
if (true) {
var str = 'hello world';
}
console.log(str);
}
输出:
hello world
(2)允许在相同作用域内重复声明同一个变量
var var1 = 'var1 first.';
var var1 = 'var1 second.';
console.log(var1);
输出:
var1 second.
(3)var可以先使用,后声明
var1 = 'var1 first.';
var var1;
console.log(var1);
输出:
var1 first.
(4)声明后未赋值
var var1;
console.log(var1);
输出:
undefined
2.let
(1)作用域:
只在let命令所在的代码块内({})有效
function func() {
if (true) {
let str = 'hello world';
}
console.log(str);
}
报错:
Uncaught ReferenceError: str is not defined
(2)不允许在相同作用域内重复声明同一个变量
let var1 = 'var1 first.';
let var1 = 'var1 second.';
console.log(var1);
报错:
Uncaught SyntaxError: Identifier 'var1' has already been declared
(3)let必须先声明后使用
var1 = 'var1 first.';
let var1;
console.log(var1);
报错:
Uncaught ReferenceError: var1 is not defined
(4)声明后未赋值
let var1;
console.log(var1);
输出
undefined
3.const
const声明一个只读的常量
(1)作用域:
只在声明所在的块级作用域内有效
{
const PI = 3.1415;
}
console.log(PI);
报错:
Uncaught ReferenceError: PI is not defined
正确的使用位置
{
const PI = 3.1415;
console.log(PI);
}
输出:
3.1415
(2)声明之后值就不能改变
const PI = 3.1415;
PI=3;
报错:
Uncaught TypeError: Assignment to constant variable.
(3)声明后必须立即初始化
const PI;
PI = 3.1415;
console.log(PI);
报错:
Uncaught SyntaxError: Missing initializer in const declaration
(4)不允许在相同作用域内重复声明同一个变量的
const PI = 3.1415;
console.log(PI);
const PI = 3.1415926;
console.log(PI);
报错:
Uncaught SyntaxError: Identifier 'PI' has already been declared
正确的用法
const PI = 3.1415;
var s= 3*3*PI;
console.log(s);
输出:
28.273500000000002
4.常见的面试题
var msg = ["This", "is", "a", "test"];
for (var i = 0; i < msg.length; i++) {
console.log("outer:"+i);
setTimeout(function() {
console.log("index:" + i + ",msg:" + msg[i]);
}, 0);
}
输出:
outer:0
outer:1
outer:2
outer:3
index:4,msg:undefined
index:4,msg:undefined
index:4,msg:undefined
index:4,msg:undefined
原因:
setTimeout的执行方式是异步执行
JavaScript 是单线程的,遇到setTimeout后会另开一条线程
执行setTimeout里的代码时,同步代码for循环已经执行完成
整个循环中只有一个i,i被for循环以及三个回调函数共用,循环结束后i=4,已经超出了原本数组的范围
把var 改成let
var msg = ["This", "is", "a", "test"];
for (let i = 0; i < msg.length; i++) {
console.log("outer:"+i);
setTimeout(function() {
console.log("index:" + i + ",msg:" + msg[i]);
}, 0);
}
输出:
outer:0
outer:1
outer:2
outer:3
index:0,msg:This
index:1,msg:is
index:2,msg:a
index:3,msg:test
原因:
let所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束
暂时性死区:只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域, 不再受外部的影响
javascript中var、let、const的区别的更多相关文章
- javascript中var let const三种变量声明方式
javascript中var let const三种变量声明方式 1.var ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...
- ES6中var/let/const的区别
let的含义及let与var的区别: let 声明的变量只在它所在的代码块有效: 如下: for (let i = 0; i < 10; i++) { console.log(i); } con ...
- 【前端面试】(四)JavaScript var let const的区别
视频链接: JavaScript var let const的区别 - Web前端工程师面试题讲解 参考链接: JavaScript 变量 JavaScript Let JavaScript Cons ...
- JavaScript中var和this定义变量的区别
JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...
- JavaScript中:表达式和语句的区别
JavaScript中:表达式和语句的区别 Javascript语言精粹:表达式是由运算符构成,并运算产生结果的语法结构.程序是由语句构成,语句则是由“:(分号)”分隔的句子或命令.如果在表达式后面加 ...
- var let const 的区别
Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- JavaScript中var、let和const的区别(转载)
一.前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . c ...
- javascript中var、let和const的区别
在javascript中,var.let和const都可以用来声明变量,那么三者有什么区别呢?要回答这个问题,我们可以从先想想:三种不同的声明会影响变量的哪些方面?这些方面也就是变量的特性,那么变量有 ...
随机推荐
- 【Javascript】call
var ShowDlg = function ShowDlg() { } ShowDlg.prototype.animate = function(msg) { alert(msg); } var l ...
- nginx常用运维日志分析命令
nginx常用日志分析命令 运维人员必备 常用日志分析命令 1.总请求数 wc -l access.log |awk '{print $1}' 2.独立IP数 awk '{print $1}' acc ...
- Xamarin.Forms之样式
使用XAML样式设置Xamarin.Forms应用的样式Xamarin.Forms应用程序的样式传统上是通过使用Style类将一组属性值分组到一个对象中来完成的,然后可以将其应用于多个视觉元素实例. ...
- bzoj4605: 崂山白花蛇草水 权值线段树套KDtree
bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...
- Linux下的零拷贝
Reference: https://segmentfault.com/a/1190000011989008 零拷贝是什么? 维基百科对“零拷贝”是这样描述的: "Zero-copy&qu ...
- linux高性能服务器编程 (九) --I/O复用
第九章 I/O复用 I/O复用就是一个线程可以同时监听多个文件描述符,提高程序性能.虽然I/O复用可以同时监听多个文件描述符,但是它本身是阻塞的,如果多个文件描述符准备就绪,如果不采取措施它仍然是串行 ...
- CentOS 7上安装Apache
安装apache yum install httpd vi /etc/httpd/conf/httpd.conf 修改默认端口为81 service httpd start netstat -nltp ...
- .net web.config中配置字符串中特殊字符的处理
https://www.cnblogs.com/zzmzaizai/archive/2008/01/30/1059191.html 如果本身字符串中有特殊字符,如分号,此时就需要用单引号整体包裹起来, ...
- java8 新特性parallelStream 修改默认多线程数量
parallelStream默认使用了fork-join框架,其默认线程数是CPU核心数. 通过测试实践,发现有两种方法来修改默认的多线程数量: 1.全局设置 在运行代码之前,加入如下代码: Syst ...
- rpm 打包:ERROR: No build ID note found in xxxx
网上找修复方法 方法1: define区添加以下这行 %define debug_package %{nil} 参考:https://forums.fedoraforum.org/showthread ...