目录
1. 我们JavaScript引擎运行js分为两步: 预解析 代码执行
2.预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
1.作用域
1.1作用域概述
通常来说,一段程序代码中所用到的名字不是有效和可靠的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序的局部性,增强了程序的可靠性,减少了名字冲突。
- JavaScript作用域:就是代码名字的(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性更重要的是减少命名冲突
- JavaScript 的作用域(es6)之前:全局作用域 局部作用域
- 全局作用域:整个script 标签 或者是一个单独的js文件
- 局部作用域 (函数作用域)在函数内部就是局部作用域 这个代码的名字只在函数内部起作用效果和作用
2.变量的作用域
2.1 变量作用域的分类
在JavaScript中,根据作用域的不同,变量可以分为两种:
- 全局变量 在全局作用域下的变量,在全局下都可以使用
- 局部变量 在局部作用域下的变量 后者在函数内部的变量就是局部变量
2.2全局变量
在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)
- 全局变量在代码的任何位置都可以使用
- 在全局作用域下var 声明的变量 是全局变量
- 特殊情况 在函数内不使用 var声明的变量也是全局变量(不建议使用)
2.2局部变量
在及局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
- 局部变量只能在该函数内部使用‘
- 在函数内部var 声明的变量是全局变量
- 函数的形参实际上就是局部变量
2.3全局变量和局部变量的区别
- 全局变量: 在任何一个敌方都可以使用,只有在浏览器关闭时候才会被销毁,因此比较占内存
- 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码运行结束后,就会被销毁,因此更节省内存空间
1.4 JS没有块级作用域
es6 新增了块级作用域
3.作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的局部作用域、
- 如果函数中还有函数,那么在这个作用域中就可以诞生一个作用域
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定那些诗句能被内部函数访问,就称作作用域链
JavaScript 预解析导读
JavaScript代码执行是由浏览器中的JavaScript解释器来执行的。JavaScript解释器在运行JavaScript代码的时候分为两步:预解析和代码执行。
1. 我们JavaScript引擎运行js分为两步: 预解析 代码执行
- 预解析 js 引擎会把js 里面所有的var 还有 function 提升到当前作用域的最前面
- 代码执行 按照代码书写的顺序从上而下执行
2.预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
- 变量提升 就是把所有的变量提升到当前的作用域最前面 不提升赋值操作
- 函数提升 就是把所有的函数申明提升到当前作用域的最前面 不调用函数
JavaScript 对象
1.对象
1.1什么是对象?
对象:是一个具体的事物。例如:数据库,一个网页,一个远程服务器的连接也可以是对象。
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串,数值,数组,函数等。
对象是由属性和方法组成的。
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法: 事物的行为,在对象中用方法来表示(常用动词)
1.2为什么需要对象
保存一个值,可以使用变量,保存多个值(一组值)时,可以使用数组。
例如:保存一个人的完整信息。使用js 的对象表达式更加强大。
2.创建对象的三种方式
在JavaScript中,现阶段我们可以采用三种方式创建对象(object)
- 利用字面量创建对象
- 利用new object 创建对象
2.1利用字面量创建对象
对象字面量:就是换括号{ } 里面包含了表达式具体事物(对象)的属性和方式。
对象的调用
- 对象里面的属性调用:对象.属性名, 这个小点。就理解为"的"
- 对象里面属性的另外一种调用方式:对象['属性名'],注意方括号里面的属性必须加引号,后续会使用
- 对象里面的方法调用:对象.方法名(),注意这个方法名字后面一定加括号
变量,属性,函数,方法总结
- 变量:单独声明赋值,单独存在
- 属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
- 函数:单独存在的,通过"函数名()" 的方式就可以调用
- 方法:对象里面的函称为方法,方法不需要声明,使用“对象.方法名()”的放还是可以调用,方法用来描述该对象的行为和功能。
2.2利用new Object 创建对象
var obj = new Object(); //创建了一个空的对象
- 我们是利用 等号 = 赋值的方法 添加对象的属性和方法
- 每个属性和方法之间 分号结束
2.3利用构造函数创建对象
构造函数 : 是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始化值,他总与new运算符一起使用。我们可以把对象中的属性和方法抽取出来,然后分装到这个函数里面。
构造函数语法格式:
function 构造函数名() {this.属性 = 值;
this.方法 = function() { }
}
使用:
new 构造函数名();
2.创建对象的三种方式
2.4构造函数和对象
- 构造函数,如 Stars(),抽象了对象的公共部分,分装到了函数里里面,它泛指某一大类(class)
- 创建对象,如 new Stars() 特指某一个,通过 new 关键字创建对象的过程我们称之为对象实例化
3.new 关键字
new 在执行时会做四件事情:
- 在内存中创建一个空的对象
- 让 this 指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新对象(所以构造函数里面不需要return)
4.遍历对象属性
for...in 语句用于对数组对象的属性进行循环操作。
基本格式:
for (变量 in 对象) {
console.log(k); // k 变量 输出 得到的是 属性名
console.log(obj[k]); // obj[k] 得到是 属性值
}
对象小结:
- 对象可以让代码结构更清晰
- 对象复杂数据类型object
- 本质:对象就是一组无序的相关属性和方法集合。
- 构造函数泛指某一大类,比如苹果,无论红色还是绿色都称为苹果
- 对象实例特指一个事物。
- for...in 语句用于对对象的属性进行循环操作。