作用域
全局作用域、函数作用域、块作用域(ES6)
函数作用域在函数定义的时候就确定了,this是在函数调用的时候确定的
三种变量
1 | //实例变量:(this)类的实例才能访问到的变量 |
this
this指向
this永远指向函数运行时所在的对象。
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this。
this的指向在函数定义时无法确认,只有函数执行时才能确定。
根据函数的调用方式的不同,this会指向不同的对象:
1、以函数的形式调用时,this永远都是window。比如fun();相当于window.fun(),不管在哪个函数里调用,都是这样;
2、以方法的形式调用时,this是调用方法的那个对象
3、以构造函数的形式调用时,this是新创建的那个对象
4、使用bind,call和apply调用时,this是指定的那个对象
5、箭头函数this:完全修复了this的指向,它没有自己的this,箭头函数的this不是调用的时候决定的,而是在定义的时候处在的对象就是它的this。箭头函数的this看外层的是否有函数,如果有,外层函数的this就是内部箭头函数的this,如果没有,则this是window。
各类this
1 | // 全局下的this |
易错题
1 | var name = '我是window' |
转换this方法
1 | //Function.prototype.bind();替换this,但是不会执行函数 |
应用场景
1 | // bind(arg1, arg2...) 第一个参数为this,第二个参数当函数的第一个实参,执行的时候还可以再传 |
闭包
什么是闭包
一个函数里的一个局部变量和一个内部函数的总和就是闭包
闭包的作用
闭包常常用来间接访问一个变量
1 | // 最简单的闭包 |
函数执行完后,内部声明的局部变量还存在吗
一般是不存在的,存在于闭包中的变量会存在
闭包的生命周期
产生: 嵌套内部函数fn2被声明时就产生了(不是在调用)
死亡: 嵌套的内部函数成为垃圾对象时。(比如f = null,就可以让f成为垃圾对象。意思是,此时f不再引用闭包这个对象了)
闭包的缺点
缺点:函数执行完后, 函数内的局部变量没有释放,占用内存时间会变长,容易造成内存泄露。
解决:能不用闭包就不用,及时释放。比如:1
f = null; // 让内部函数成为垃圾对象 -->回收闭包
内存溢出和内存泄露
内存溢出
一种程序运行出现的错误。当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误。
比如死循环,数据过大。
内存泄漏
占用的内存没有及时释放。
常见的内存泄漏:1.意外的全局变量 2.没有及时清理的计时器或回调函数 3.闭包