JavaScript 中 this 和闭包
on Front-End
this
先来看几个知识点:
方法在定义的时候(不是调用的时候),就已经确定了方法体内部自由变量的作用域。
在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用
undefined
占个空。在方法中
this
到底取何值,是在方法真正被调用执行的时候确定的,方法定义的时候确定不了。JavaScript
没有块级作用域。除了全局作用域之外,只有函数可以创建的作用域。作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。
如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
有关 this
的取值,大概会分四种情况:
构造函数
构造函数就是用来 new 对象的函数,所有的函数都可以 new 一个对象,但是有些函数的定义是为了 new 一个对象,而有些函数则不是。
如果一个函数作为构造函数用,那么其中的 this
就代表它即将 new 出来的对象。
函数作为对象的一个属性
如果函数作为对象的一个属性,并且作为对象的一个属性被调用时,函数中的 this
指向该对象。
函数用 call
或者 apply
调用
当一个函数被 call
和 apply
调用时,this
的值就取传入的对象的值。
全局 & 调用普通函数
在全局环境下和普通函数在调用时,this
永远是 window
。
闭包
一个比较简单的理解:闭包就是定义在一个函数内部的函数。