函数可以作为值使用,而且其局部变量会在每次函数调用时重新创建,由此引出一个值得我们探讨的问题:如果函数已经执行结束,那么这些由函数创建的局部变量会如何处理呢?
下面的示例代码展示了这种情况。代码中定义了函数wrapValue,该函数创建了一个局部变量localVariable,并返回一个函数,用于访问并返回局部变量localVariable。
与你期望的一样,这段代码可以正确执行。其中的变量仍然可以访问。其实同一变量的多个实例可以同时存在,这也就很好地印证了局部变量会在每次函数调用时重新创建,不同的函数调用是不会对其他函数内的局部变量产生任何影响的。
我们把这种引用特定的局部变量实例的功能称为闭包。一个包装了一些局部变量的函数是一个闭包。利用闭包的特性,我们不再需要担心变量的生命周期问题,很多高级应用都依靠它来实现。
我们对上面那个例子稍加修改,就可以创建一个可以乘以任意数字的函数。
由于参数自身就是局部变量,因此我们不需要声明localVaraible变量。
需要花些时间进行练习才可以编写出类似于这样的程序。我们可以把关键字function当作一种“冻结”代码并将其打包成函数值的模型。所以当你看到“return function(…){…}”这样的代码时,你可以将其理解为一个句柄,其中句柄指向一段包装好的计算代码。
在本例中,multiplier返回了一段打包好的代码片段,并将其存储在twice变量中。最后一行调用了存储在该变量中的值,也就是调用multiplier创建的代码片段,随后将代码片段解包,并将5作为参数number传递给这段代码。