几个测试小代码:关于预解析的。
js代码执行分两个阶段:
1)提升声明
2)真正执行,此阶段才会产生执行上下文(栈内存空间)
全局执行上下文和局部执行上下文:
当js代码刚开始执行时,会产生一个全局的执行上下文,当调用一个函数的时候才会产生一个局部的执行上下文。
js中的声明:
变量的声明:使用var 来声明一个变量,不管什么情况下,加var变量都会提升。
函数的声明:使用function来声明一个函数,函数在条件语句中,函数名会被提升,但是函数值不会被提升。
-------------------------------------今天新内容---------------------------
预解释概念:预解释·(预解析):提升声明:在预编译期间,它会把声明进行提升,提升是加var的变量和function声明的函数
1)关于变量的提升 ,加var的变量的提升,只提升变量的声明,不提升变量的赋值
2)函数的提升,function声明的变量的提升,不只是提升函数名,还提升函数值
小知识点(delete是删除运算符);
加var和不加var有什么区别:
1)在全局作用域下,加var的变量会提升,不加var的变量不会被提升;
2)在全局作用域下,无论加还是不加var,都会作用于window这个对象
3)在局部作用域下,不加var的变量也会作用域window这个对象
4)不加var的变量只能作为全局变量,不能作为局部变量
5)不加var的变量可以被删除,加了var的变量不能被删除
小知识:for in 用来判断某个属性是否属于某个对象
代码执行步骤:
1)预编译 2)执行
全局执行上下文和局部执行上下文:
全局执行上下文:当代码开始执行时,就相当于全局执行上下文
局部执行上下文:当调用一个函数的时候,就相当于一个局部执行上下文
1,预编译:提升 var function(数据存储)
2,执行代码
1,形参的赋值
2,提升
3,执行代码
使用var声明变量的不足,Es6提出使用let来声明变量
let声明变量------------------不能提升---------------------------
1)使用let声明变量会产生一个块级作用域({}形成的作用域)(里面的东东外面不能用)
2)在全局作用域下面不能访问块级作用域
3)使用let声明的变量不能提升
4)let声明的变量不会作为window的属性
5)let声明的变量不能重复声明
6)暂时性死区:可以去es6.ruanyifeng.com去了解。(TDZ)
const声明变量------------------使用const声明常量------------------------
const不能只声明,不赋值,所以记得一上来就要给它赋值。
使用const声明的变量也不能提升
以后做项目都用const,记住能使用const就使用const,如果声明的变量需要改变,就用Let。
1)有条件的情况下:只提升函数名,不提升函数值,
当满足条件的时候,进去的第一个操作就是给这个函数赋值
2)没条件的情况下:同时提升函数名和函数值,和上面说的一样。