变量提升
为什么学习变量提升?
- 知道书写代码的规范
- 能够更加了解代码在浏览器里的运行机制
什么是变量提升
-
是一个阶段,在代码运行之前
-
范围:在当前作用域下
-
含义:在当前作用域下,代码执行前,对带var关键字和function关键字的进行声明和定义
- 对var关键字是声明
- 对function关键字是声明加定义。
-
函数定义的步骤:
- 1.首先开辟一个堆内存,假设引用地址是FFF000;
- 2.将函数体的内容以字符串的形式保存到内存空间种;
- 3.将引用地址赋值给函数fn,fn代表整个函数;
-
函数执行步骤:
- 1.形成一个私有作用域
- 2.形参赋值
- 3.变量提升
- 4.将函数体的内容转换成JS代码,代码从上往下运行
作用域
- 全局作用域
- 页面加载时形成,全局变量
- 全局作用域下,带var和不带var的区别:var m = 13;和m = 13;
- 不同之处:带var的会进行变量提升,不带var的没有变量提升
- 相同之处:都是window属性,是全局变量
- 私有作用域
- 函数运行时形成,私有的变量:形参,带var关键字的变量
- 若在私有作用域下有私有变量n,则在这个方法里用到的变量n全是私有变量
- 作用域查找问题(对不带var的变量进行查找)
- 1.若是私有作用域有,则是私有的,与外界无关
- 2.若在私有作用域中没有,则会往上级作用域查找,若还没有,继续往上级查找,直到找到window,若window下也没有则报错
- 什么是上级作用域?
- 函数在哪定义的,它的上级作用域就是谁。
- 和函数定义有关,和函数执行无关。
变量提升细节的知识点
- 1.只对等号左边的进行变量提升,等号右边的不进行变量提升。
- 函数表达式执行必须要在函数表达式声明的下面
- 2.return 后面的内容不进行变量提升,return下面的进行变量提升
- 函数作为值存在时 不进行变量提升
- 3.重名变量不会重复声明,但会重复赋值
- 4.自执行函数本身不进行变量提升
- 5.不管条件是否成立,对带var关键字进行声明,对function关键字标准浏览器只声明不定义,IE浏览器下声明+定义。
逻辑与(&&)逻辑或(||)
- 条件判断中逻辑与
&&
和逻辑或||
都会对两边内容进行内容转换成布尔类型 - 逻辑与
&&
: 两边都为真才为真,有一为假就是假 - 逻辑或
||
:只要有一个真则为真,全假则假 - 在运算中:
&&
左边为真则返回右边,左边为假则返回左边||
左边为真则返回左边,左边为假则返回右边
运算符优先级
- 算术运算符(+-*/%)>比较运算符(>= <= == !=)>逻辑运算符(&& ||)>赋值运算符