闭包与域
是时候来看下一个带函数的函数是如何工作的:
(function (x) {
return function (y)
{
return x
}
})(1)(2)
//=> 1
首先,我们使用我们学过的东西。给出
(某函数)(某参数),我们知道我们将函数应用到参数,创建一个环境,将参数的值绑定到名称,然后对函数表达式求值,所以我们首先用这段代码这样做:
(function (x) {
return function (y) {
return x
}
})(1)
//=> [Function]
这个环境属于带标识的function (x) ... becomes {x: 1,
...}函数,而应用这个函数的结果是另一个函数值。返回值为函数是有意义的,因为function (x) ...的函数体的表达式是:
function
(y) {
return x
}
所以现在我们有一个代表该函数的值,现在我们打算取该函数的值然后将它应用到参数2,像这样:
(function (y) {
return x
})(2)
所以我们似乎得到了一个新的环境{y: 2, ...}。在该函数的环境中表达式x将如何被求值呢?在自己的环境中是没有x的,它必须来自其他的地方。
顺便说一下,这是javascript及其同家庭语言的其中一个伟大的定义特征: