美文网首页
call和apply

call和apply

作者: 海子小夜曲 | 来源:发表于2018-12-11 19:38 被阅读0次

### 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

相关文章

网友评论

      本文标题:call和apply

      本文链接:https://www.haomeiwen.com/subject/dgnehqtx.html