九、JS作用域
9.1 作用域概念
作用域:就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序可靠性,减少命名冲突。
作用域分为两类(es6之前)
-
全局作用域:即整个script标签或者是一个单独的JS文件。
-
局部作用域:在函数内部即为局部作用域,即这个代码的名字和效果只在函数内部起效果。
若在全局作用域中和局部作用域中各有一个’var num=10’,他们不会互相影响。
9.2变量的作用域
根据变量不同也可分为两种变量
- 全局变量:在全局作用域下声明的变量,注:在函数里面为声明直接赋值的变量也为全局变量。
- 局部变量:在局部作用域下声明的变量(或者在函数内部的变量),只能在函数内部使用。(函数的形参也是局部变量)
下图中num1为局部变量,num2为全局变量
全局变量和局部变量区别:全局变量只有在浏览器关闭使才会销毁,比较占内存;局部变量在程序执行完毕后即销毁,比较节约内存。
9.3块级作用域
JS没有块级作用域,也是在es6的时候新增的块级作用域,大括号{}包括的就是块级作用域。意思就是大括号里面声明的变量外边不能引用。
9.4作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的局部作用域
- 如果函数里面还有函数,那么在这个作用域中又可以诞生一个新作用域
- 根据在内部函数可以访问外部函数变量这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。
内部函数访问外部函数的变量,采取的是链式查找的方式决定取哪个值 就近原则
如下图,先查找内部函数外层的函数看看有无num,若有则访问它,若没有再访问外一层的全局作用域中有无num,下图输出为20
案例
输出结果为123.
十、JS预解析
10.1 预解析(重点)
js引擎运行js分为两步:
- 预解析:会把js里面的var还有function提升到当前作用域的最前面。
- 代码执行:按照代码书写顺序从上往下执行
预解析分为两种:①变量预解析:就是把变量声明提升到当前作用域的最前面,不提升赋值
②函数预解析:就是把所有函数声明提升到当前作用域最前面,不调用函数
上图报错是因为根据预解析相当于先输出再赋值。
上图可以运行是因为根据函数与解析可知
上图报错是因为声明函数的var被提前,函数主体没有提前,总的来说匿名表达式会被报错
经典案例
(一)
先预解析,再根据作用域链分析最后结果:undefined;20。
(二)难点
var a=b=c=9,只有a声明,b和c集体赋值,看作全局变量,输出结果为9,9,9, 9,9,undefined。
十一、对象
对象是一个具体的事物,在JS中,对象是一组无序相关属性方法的集合,例如字符串,数值,数组,函数等等。
对象由属性和方法构成。
- 属性:事物的特征,在对象中用属性表示;(常用名词)
- 方法:事物的行为,在对象中用方法来表示。(常用动词)
对象的作用:
保存个人信息的时候对象作用更大
变量、属性、函数、方法的区别
变量需要单独声明并赋值,使用的时候可直接写变量名;属性在对象中不需要声明,使用的时候必须是 对象.属性
函数是单独声明,调用时 函数名();方法在对象里面,调用时 对象。方法()
11.1 创建对象的三种方式
①利用字面量创建对象:就是用{}包含对象的属性和方法。
(一)多个属性值或者方法之间用逗号隔开,方法后面跟的是一个匿名函数。
(二)调用函数里面的属性,采取 对象名.属性名,或者对象名【‘属性名‘】
(三)调用对象的方法,对象名.方法名(),因为函数后面要加个括号。
②利用new Object创建对象
多个属性值或者方法之间用分号隔开,属性名与属性值间用等号连接
③利用构造函数创建对象
就是把对象里面一些相同的属性和方法抽象出来封装到函数里面,可以一次创建多个对象。
构造函数的语法格式
function 构造函数名(){
this.属性=值&#x