开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
函数中各种this的情况
| 函数的角色 | this的指向 |
|---|---|
| 普通函数 | window对象 |
| 事件处理程序 | 事件源 |
| 定时器的回调函数 | window对象 |
| 对象的方法 | 实例对象 |
| 构造函数 | 实例对象 |
如果还遇上更多的情况,想要知道this是不是我们想要的,输出看看
闭包
什么是闭包:一种编程技巧,可以让局部作用域的数据有效范围增加
具体表现为两点:
1.保护数据
2.缓存数据
保护数据的实现过程
// 1 需要先写一个外部的函数
function f1(){
// 2 在外部函数的局部作用域里面声明一个数据
var a = 10;
// 3 声明一个内部函数
function f2(){
// 4 在内部函数里面,操作外部函数的局部变量
a++;// 具体逻辑自己决定
}
// 5 把内部函数作为外部函数的返回值
return f2;
}
缓存数据的实现过程
// 1 需要一个外部的函数
function f1(){
// 2 在局部作用域先存储一个数据
var _this = this;
// 当我我们需要在函数内部的函数里面,得到外部函数的数据的时候,就使用闭包
function f2(){
// 直接使用 外部存储的 _this 就是得到了缓存的数据
console.log(_this);
}
}
只要是在函数内部访问函数外部的局部变量,都是形成了闭包
闭包的原理
1作用域链
就是多级作用域下的变量的访问规则
1优先使用自己内部的,2如果内部没有,找上一级作用域,直到全局作用,3如果全局也没有,报错
2函数可以作为返回值
为什么函数可以作为返回值 —— 因为函数也是一种数据类型。js里面语法规定,只要是数据类型,就可以作为参数和返回值。
保护数据的时候,用到了两个原理,但是如果是缓存数据的时候,就使用到作用域链