add: call()、apply()、bind()的区别

This commit is contained in:
qianguyihao
2020-07-04 17:27:59 +08:00
parent 7d44e5a2c6
commit 1c075a0e7b
13 changed files with 449 additions and 229 deletions

View File

@@ -468,6 +468,91 @@ function fn(){
我们可以这样说如果直接是`fn()`那就说明是函数调用如果是`XX.fn()`的这种形式那就说明是**方法**调用
## 类数组 arguments
> 这部分小白可能看不懂所以这一段暂时可以忽略
在调用函数时浏览器每次都会传递进两个隐含的参数
- 1.函数的上下文对象 this
- 2.**封装实参的对象** arguments
例如
```javascript
function foo() {
console.log(arguments);
console.log(typeof arguments);
}
foo();
```
![](http://img.smyhvae.com/20180315_0903.png)
arguments 是一个类数组对象它可以通过索引来操作数据也可以获取长度
**arguments 代表的是实参**在调用函数时我们所传递的实参都会在 arguments 中保存有个讲究的地方是arguments**只在函数中使用**
### 1返回函数**实参**的个数arguments.length
arguments.length 可以用来获取**实参的长度**
举例
```javascript
fn(2, 4);
fn(2, 4, 6);
fn(2, 4, 6, 8);
function fn(a, b) {
console.log(arguments);
console.log(fn.length); //获取形参的个数
console.log(arguments.length); //获取实参的个数
console.log('----------------');
}
```
打印结果
![](http://img.smyhvae.com/20180125_2140.png)
我们即使不定义形参也可以通过 arguments 来使用实参只不过比较麻烦arguments[0] 表示第一个实参arguments[1] 表示第二个实参...
### 2返回正在执行的函数arguments.callee
arguments 里边有一个属性叫做 callee这个属性对应一个函数对象就是当前正在指向的函数对象
```javascript
function fun() {
console.log(arguments.callee == fun); //打印结果为true
}
fun('hello');
```
在使用函数**递归**调用时推荐使用 arguments.callee 代替函数名本身
### 3arguments 可以修改元素
之所以说 arguments 是伪数组是因为**arguments 可以修改元素但不能改变数组的长短**举例
```javascript
fn(2, 4);
fn(2, 4, 6);
fn(2, 4, 6, 8);
function fn(a, b) {
arguments[0] = 99; //将实参的第一个数改为99
arguments.push(8); //此方法不通过,因为无法增加元素
}
```
## arguments 的使用
当我们不确定有多少个参数传递的时候可以用 **arguments** 来获取 JavaScript arguments 实际上是当前函数的一个**内置对象**所有函数都内置了一个 arguments 对象只有函数才有 arguments 对象arguments 对象中存储了**传递的所有实参**.