今天理解两个难点,闭包和this指向,闭包其实现在还是似懂非懂,需要有空运用一下闭包可能会更加理解。
先说下this指向问题:
1 | var name = "The Window"; |
学习闭包的时候这段代码看得我很懵,想不清楚为什么this是指向window的。那么我们先了解一下this指向问题。
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是this所在函数的上一级对象。
上面这句话非常重要,这是this非常重要的特点:
1 | function test(){ |
如果这不够直观,那么换种更加直观的写法:
1 | var x = 1; |
上面是直接在全局调用函数,this指向window对象,函数还可以作为对象的方法调用,
1 | function test(){ |
再来看个例子
1 | var o = { |
对上面函数进行下稍微的改造
1 | var o = { |
这样看下来后应该对this的指向有一个基本的了解了。接下来说闭包:
文章开头引用的代码其实就是一个闭包,是我在看阮一峰闭包博客的时候看到的代码,开始是想了解闭包的,接过被带偏跑去看this指向了。
1 | function f1(){ |
将f2返回出来后,f2处于全局环境中,但是由于Js是静态作用域,变量的作用域在声明的时候就已经确定并且不会再改变,所以f2函数执行的时候作用域还是f1,因此f2在全局环境下执行的时候还是可以访问到f1中的变量,而f2执行后返回的值,由于f2处于全局变量,所以返回出来的值也在全局环境中,但是返回后这个值一直存在于全局环境中,而这个值的存在依赖于f2,f2又依赖于外部的f1,所以f1函数在调用完成后不会被内存回收机制回收,一直存在于内存中。
1 | function f1(){ |
上面代码中f1函数调用了两次,返回的结果都是正常的,说明var n = 999;一直在内存中,如果被回收了那么第二次调用的时候局部变量n就应该无法被访问到。