我正在通过Douglas Crockford的JavaScript系列讲座。我对他所展示的代码示例感到困惑,以说明'封闭':
query << "SELECT blah blah FROM blah blah WHERE status_id IN(?, ?)"
query << " AND end_date IS NULL "
...
ActiveRecord::Base.connection.select_all(query.join, STATUS_1, STATUS_2)
&#13;
如果定义中没有指定参数(最外面的函数),var digit_name = (function () {
var names = ['zero', 'one', 'two', 'three'];
return function (n) {
return names[n];
};
}());
alert(digit_name(3));
如何/为什么可以参数?在调用期间,参数(在本例中为digit_name
)如何知道内部函数定义中的3
?
答案 0 :(得分:2)
digit_name
存储外部函数编写的内部函数return
,这是立即执行的函数表达式,其中内部函数具有带有一个参数的签名,这就是digit_name
中存储的内容。
function (n) {
return names[n];
}
最终,上面的内容将是digit_name
,而names
是一个私有变量,它与digit_name
的环境捆绑在一起。私有变量的概念只能使用闭包。
要说清楚,请看:
答案 1 :(得分:0)
Theres一个自我调用,匿名函数(function(){})()。所以digit_name不是函数,它的函数输出是return语句。所以这发生在浏览器中:
var digit_name=(function(){})();
var digit_name=function(n){}
答案 2 :(得分:0)
外部函数是一个IIFE,一个立即调用的函数表达式。脚本启动时会运行该函数,因此IIFE返回的内部函数是分配给digit_name的函数。
&#34;魔法&#34;如果这个内部函数仍然可以访问闭包中的所有东西(例如names数组),那么闭包。