1.变量
声明变量的方式:var function 用来定义变量
es6定义变量的关键字
let conts class import var function
备注:不能忽略函数的形参 函数的私有变量
var 定义变量
var变量能够提升但是不能定义 给window 添加一个属性
function既可以提前声明 同时还定义了
定义:所谓的定义就是给这个变量赋值了
let是es6提供的一种声明变量的方式
1.没有变量提升功能 在声明之前不能使用
2.不能重复声明
3.不会给window添加属性
作用域
var 作用域
var 声明的变量 作用域分两种
全局作用域
在window下声明的变量或者是在函数外声明的变量
局部作用域
在函数内声明的变量
了解浏览器执行的机制
浏览器在执行的时候,首先开辟一个大空间叫window, window下面分两个模块,一个叫栈,一个叫堆。栈用来存放变量的内存地址,堆主要存放代码块。然后浏览器从上到下执行代码
function 申请的变量
function 声明的变量也给window 添加一个属性属性值是方法。
函数归属?
1.函数归谁,跟他在哪调用无关,跟他在哪定义有关
2.任何一个函数执行后都有一个返回值如果写了return,return的是什么就是什么,如果没有return就是undefined
3.函数在if中的特殊情况
在if语句中定义的函数,只声明不定义,当条件成立的时候,if模块中不管函数在哪声明的函数,都会第一步对函数先定义,在执行if里面的代码块
let声明的变量
带{}的都是块级作用域(私有作用域),if(){} for(){} 对象(){}函数不是块级作用域因为函数本身就是私有作用域
var function 没有块级作用域这个概念,let和const有块级作用域这个概念
1.在块级作用域下var 和function 跟在window下一样,function有一个特殊的,在块级作用域前声明不会定义
2.在块级作用域下let和conts声明的变量是私有的,外面访问不到
3.for循环下let声明的变量不会泄露
事件是异步的,for循环结束之后i是3并且i还是全局的,点击li最后alter出i,i此时是3,所以都会弹出3
块级作用域和对象的区别
这个是块级作用域
{}如果想表示对象,不能放在行首,就是{}前面不能没有东西。如果{}前面什么都没有就是块级作用域
暂时性死区
如果块级作用域内使用let和conts命令声明变量了,这个区域就会被这个变量强制绑定,凡是在声明之前这些变量都是不可用的,使用会报错,这就是暂时性死区
暂时性死区场景
使用变量b在定义变量之前,出现了暂时性死区
let a=a;报错 赋值运算是从右往左,右边使用变量a结果发现a没有声明,而let语法规定不能在没有定义前使用变量,所以报错
var a=a;不报错 因为var可以变量提升在等号赋值的时候,是从右往左,使用变量a,此时a是undefined,赋值时就是把undefined赋值给a,所以a还是undefined
函数参数默认值
1.写法上有默认值得写后面,没有默认值的写前面
2.如果传对应的参数,就不要默认值了,不是先赋默认值然后实参去覆盖