es5 中提供了 两个声明变量的方式es6
var function浏览器
es6 中提供了 四种声明变量的方式异步
let const class import函数
如今,定义变量的关键字有 6 个了es5
备注:不能忽略函数的形参函数的私有变量;对象
var 定义变量blog
var 的功能: 变量提高,可是未定义,给 window 添加一个定义的属性事件
function 定义变量内存
function 的功能:既能够变量提高,同时还进行了定义作用域
let 定义变量
是 es6 提供的一种声明变量的方式
1. 没有变量提高的功能,在声明以前不能使用;
2. 不能重复声明
3. 不会给 window 添加属性
var 的做用域:
var 声明变量,做用域分两种
一种是全局做用域
在 window 下声明变量或在函数外声明变量
一种是局部做用域
在函数内声明的变量
了解浏览器执行机制;
浏览器执行的时候,首先会开辟一个大空间,叫 window ,window 下面分两个模块,一个叫栈,一个叫堆,栈存放的变量的内存地址,堆主要存放代码块,而后浏览器从上到下执行代码
如图
function 申请变量
function 声明的变量 也会给 window 添加一个属性,属性值是方法
函数的归属
函数归谁,跟他在哪调用无关,跟他在哪定义有关
任何一个函数,执行后,都有一个返回值,若是没了 return 是什么就获得什么,若是没有 return 就是 undefined
函数在 if 中的特殊状况
var function 都有变量提高,window 下 全部的 var function
可是在 if 语句里面的定义函数,只会提早声明,不定义,当条件成立的时候,if 模块中无论函数在哪声明的,函数都会第一步对这个函数先定义,在去执行 if 里面的代码
let 声明的变量,块级做用域
带 {} 都是块级做用域;
在块级做用域,代码的执行的顺序,从上到下依次执行,哪怕块级做用域里面套块级做用域 而 局部做用域 则是,跟函数在哪调用有关
if(){} for(){} 对象{}
注意:var function 没有块级做用域这个概念,let 和 const 有块级做用域这个概念;
1. 在块级做用域下 var 和 function 跟在 window 下同样,可是 function 在块级做用域前面,只会声明,不会提早定义;
2. 在块级做用域下 let 和 const 声明的变量都是私有的,外面访问不到;
3. for 循环下,let 声明的变量不会泄露
事件是异步的,for 循环结束后,i 是 3 而且 全局,点击了 li ,最后 alert 出 i , i 此时是3 ,因此会弹 3
let 循环的好处不少; 块级做用域不会有全局一说,可让咱们更好的处理 for循环的事件
块级做用域和对象的区分;
{} 若是想表示对象,那就不能放在行首,就是大括号前面不能没东西,若是 {} 前面什么都没有,表明块级做用域
eval('({name;"zhang",age:20})') 要这种写法才能够;
eval 就是要干掉字符串,干掉字符串没法解析 {} ,因此须要在 ({}) 才能够 {} 表明块级做用域
暂时性死区
若是块级做用域内,使用 let 和 const 命令,声明变量,这个区域就会被这个变量强制绑定,凡是在声明以前,这些变量都是不可用的,使用会报错,这就是暂时性死区
暂时性死区的场景
使用变量 b ,在定义变量 b 以前了,出现暂时性死区
函数参数默认值
1. 写法,有默认写后面,没默认写前面;
2. 若是传对应的参数,就不须要默认值了,不是先赋默认值,而后用实参覆盖
var a=a 不报错,由于 var 能够变量提高,在 = 赋值 从右往左,使用变量 a ,是undefined,赋值时,就是把 undefined 赋值给 a ,因此 a 仍是 undefined;
let a=a 报错,赋值运算从右往左,右边使用变量 a 结果发现 a 没有声明,而 let 语法规定,不能在没定义前使用变量,因此报错
const 讲解
1. 定义变量,但值是常量的,一旦赋值不能在改变
2. 不能重复定义变量,没有变量提高
3. 不能给 window 添加属性