?
{
var m = 2
}
console.log(m)//输出为2
console.log(m)//输出undefined
var m = 2
?此处不会报错,因为用var声明的变量会提升声明(只提升声明)到整个作用域的开头。相当于以下代码:
var m
console.log(m)//输出undefined
m = 2
var m = 2
var m = 5
?此处不会报错。var允许重复声明变量,但它的含义是重新开辟内存空间再赋值,而并非覆盖原有的变量值
{
let m = 2
}
console.log(m)//报错
?此处报错的原因是let具有块级作用域(即一对{ }之间)
{
console.log(m)//报错
let m = 5
}
?let声明的变量智能先声明后使用
{
let m = 2
let m = 3
console.log(m)//报错
}
? 只要块级作用域内存在 let 命令,它所声明的变量就“绑定”( binding )这个区域,不再受外部的影响。
?ES6 明确规定,如果区块中存在 let命令,则这个区块对这些命令声明的变量
开始就形成封闭作用域。只要在声明之前就使用这些变量 就会报错。
var tmp = 123;
{
tmp = 'abc '; //ReferenceError
let tmp ;
}
{
const a = 2
a = 3//TypeError: Assignment to constant variable.
}
?const声明一个只读的常量,其余与let用法一致。
?当常量保存的不是原始值而是一个地址引用时,对象的属性可改变,但不能更改它的引用
{
const obj = {
name:'Ann',
age:18
}
obj.age = 20//不会报错
console.log(obj.age)//输出20
obj = {x:0,y:0}//TypeError: Assignment to constant variable.
}
============================举个栗子
?1.
{
var count = 10
let count = 20
console.log(count)//报错**SyntaxError: Identifier 'count' has already been declared
}
?2.
{
var count = 10
if(count>0){
let count = 40
}
console.log(count)//10
}
?3.
{
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6]();//10
}
?let---->块作用域,函数本身有闭包的行为,会将该变量的作用域保存
{
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6]();//6
}
?for形成外层作用域,循环内部为子作用域。两层作用域,使用就近的变量
{
for (let i = 0; i < 3; i++) {
let i = 'abc'
console.log(i)//输出三次 abc
}
}
=========================首次创作,非常激动·····(ˊ????? ? ?????ˋ)~
复制代码 代码如下: '个人代码风格注释(变量名中第一个小写字母表表示变量类型...
Http与https对比详细介绍 概要: HTTPS(Secure Hypertext Transfer Protocol)...
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的...
标准输出设备 我们知道C语言中printf函数是将程序运行后要输出的内容在显示器中...
信号章节 -- 信号章节总体概要 信号基本概念 信号是异步事件,发送信号的线程可...
Mysql一键部署脚本 一.一键部署Mysql 1.将安装Mysql所需软件包传到/opt目录下 可...
过去这一年的时间里,我买了不少书,查了很多资料,可以算是认真的学习了几种主...
macOS 最新版的系统已经出来很长一段时间了,我一直想升级,但是一直都没有升级...
本文实例讲述了基于jsp+servlet实现的简单博客系统。分享给大家供大家参考。具体...
大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需...