JavaScript 中 this 和闭包

摘要:说到 JavaScript 的难点,应该少不了 this闭包 的概念。看了很多文章去了解这两个东西,现在基本也能有一个大致的认识了。在这里做一个简单的总结吧,希望通过一点一点地积累能够让自己理解得越来越深,越来越好。

this

先来看几个知识点:

  • 方法在定义的时候(不是调用的时候),就已经确定了方法体内部自由变量的作用域。

  • 在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用 undefined 占个空。

  • 在方法中 this 到底取何值,是在方法真正被调用执行的时候确定的,方法定义的时候确定不了。

  • JavaScript 没有块级作用域。除了全局作用域之外,只有函数可以创建的作用域。

  • 作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。

  • 如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。

有关 this 的取值,大概会分四种情况:

构造函数

构造函数就是用来 new 对象的函数,所有的函数都可以 new 一个对象,但是有些函数的定义是为了 new 一个对象,而有些函数则不是。

如果一个函数作为构造函数用,那么其中的 this 就代表它即将 new 出来的对象。

函数作为对象的一个属性

如果函数作为对象的一个属性,并且作为对象的一个属性被调用时,函数中的 this 指向该对象。

函数用 call 或者 apply 调用

当一个函数被 callapply 调用时,this 的值就取传入的对象的值。

全局 & 调用普通函数

在全局环境下和普通函数在调用时,this 永远是 window

闭包

一个比较简单的理解:闭包就是定义在一个函数内部的函数。