### call|apply
1. 在实际开发时,如果需要改变函数或方法内部的this指向,那么就只能使用上下文模式来修改.
2. 借调方法: 在开发时,发现内置对象实现了所需的功能,而自定义对象没有该方法,那么可以不用自己实现,可以通过上下文模式,将该方法借调过来.此时,更加给方法传实参哪个方法,来去选择用call还是apply去借调方法.
3. 在该模式下,this的指向
* 如果第一个参数 为 null 或者 undefined值,此时this 的指向为 window对象.
* 如果第一个参数类型为基本数据类型,此时this的指向为 其对应的包装类型
* 如果第一参数类型为对象, this指向就是该对象.
## 课程笔记
### 递归
1. 概念:在函数内部 自己调用自己。一般在满足一定条件下,去调用自己本身,不然就会出现死递归。
2. 案例
* 阶乘!n
* 等差数列
* fibonacci数列
* 遍历后代元素
3. 递归思想
* 在实际开发时,将一个复杂的问题,划归成一个简单问题,并已有方法来解决。然后在迭代使用该方法将复杂的问题解决。
### 节点类型
1. 总共有12种,但要记住几个常用的
* nodeType = 1,元素节点
* nodeType = 2,属性节点
* nodeType = 3,文本节点
* nodeType = 8,注释节点
* nodeType = 9,document对象
* nodeType = 11,documentFragment文档片段
### 作用域
1. 变量的作用域:变量起作用的区域,也就说变量可以被访问到的区域。
2. 变量种类
* 全局变量 :在script标签下,不再任何函数内声明的变量,称为全局变量
作用范围是这个页面,生命周期 是随着页面存在而存在,页面销毁而销毁。
* 局部变量 :在函数内声明的变量,称为局部变量。
作用范围是在指定函数内,生命周期 是函数执行完毕就会被销毁。
3. 词法作用域:静态作用域。在js预解析阶段,确定变量的作用域。
在词法作用域中规定,变量的作用域由 其定义的位置决定 而不是由其使用的位置。
在词法作用域下,只有函数可以限定作用域。
### 变量的搜索原则
在使用某个变量时,
1. 首先,在当前作用域上查找,如果找到就直接使用该变量的值,停止查找;
2. 如果没有找到就向上一层作用域上查找,如果找到就直接使用该变量的值,停止查找;
3. 如果没有找到就继续向上一层作用域 直到 全局作用域上查找;如果找到就直接使用该变量的值
否则,就抛出引用异常,(xxx is not defined)
### 作用域链
1. 由于函数可以限定作用域,而且可以嵌套使用。所以会产生作用域链的结构。
2. 规定script标签所限定的全局作用域 为 0 级链。
在该链上如果遇到函数,就引申出另一条作用域链,级别为当前级别 + 1
以此类推,只要遇到函数就引申出新链,直到所有函数都引申出新链来。
3. 高级链可以访问低级链的数据,相反不可以;同级别链上数据不能互相访问;在访问不存在的变量时,不仅会报错,而且js性能会降低。
### JS预解析
1. 语法分析:分析js代码是否满足js语法的定义。如果在分析某行时,检查出不合语法规则就直接在
语法分析阶段(预解析阶段)抛出语法异常。
目的:保证js代码符合语法规则,能被正确的执行。
2. 变量名以及函数名提升
在变量名和函数名提升时,将变量的定义,以及函数的定义包括函数体部分都提升到当前作用域的最顶端。
__函数名提升时,相当于 定义一个变量即该函数的名字,在将函数的引用赋值给该变量__
3. 确定变量的作用域。
### in
1. 语法:'propName' in 对象
* in 运算符 左边的参数 类型必须是字符串,不是会隐式转换成字符串。
* in 运算符 右边的参数 类型必须为对象,不是会隐式转换,转换失败就会抛出异常。
2. 功能:判断对象是否能访问 propName属性,如果是自己本身属性或者是继承下来的,都会返回true
网友评论