function outerFunc() { var privateAttr = 10; function innerFunc() { privateAttr *= 2; console.log(privateAttr); return privateAttr; } return innerFunc; } var refInnerFunc = new outerFunc(); refInnerFunc(); refInnerFunc(); var refInnerFunc2 = new outerFunc(); refInnerFunc2();
var MyNamespace = {}; MyNamespace.TreeItem = (function() { var numTreeItems = 0; function counter() { numTreeItems ++; console.log("Created "+numTreeItems+" tree items!"); //alert(numTreeItems); } return counter; })(); var treeItem1 = new MyNamespace.TreeItem(); var treeItem2 = new MyNamespace.TreeItem();
第一段执行的结果是20 40 20
第二段执行结果 Created 1 tree items! Created 2 tree items!
两端代码差别就是一个匿名函数,为什么结果不一样???同样是new两个对象,为什么???
是看了这两篇文章后想到http://hbc8848.iteye.com/blog/798724和http://hbc8848.iteye.com/blog/798154
求解啊。
[code="javascript"]
function outer() { //使用闭包产生的私有静态变量,不可被外部访问 var numTreeItems = 0; //使用闭包产生的私有静态方法,不可被外部访问 function counter(){ numTreeItems ++; alert("Created "+numTreeItems+" tree items!"); } return counter; } var MyNamespace = {TreeItem : outer()}; var s1 = outer(); var s2 = outer(); s1(); // 1 s2(); // 1 MyNamespace.TreeItem(); //1 MyNamespace.TreeItem(); //2 new MyNamespace.TreeItem(); //3[/code]
哥们,这两段代码我觉得一点都不神奇。
我是这样理解的:因为第二段代码中MyNamespace.TreeItem在定义时已经指向了counter函数,这样每次new时都是在new了外层函数下的counter函数,都是在同一个变量numTreeItems下。
我表述的不是很清楚。你可以将代码改为一下形式,参照一下。
MyNamespace.TreeItem = function()
{
var numTreeItems = 0;
function counter()
{
numTreeItems ++;
console.log("Created "+numTreeItems+" tree items!");
//alert(numTreeItems);
}
return counter;
};
var treeItem1 = new MyNamespace.TreeItem()();
var treeItem2 = new MyNamespace.TreeItem()();
你这就是第一种形式,对于匿名闭包还是没解释清楚
我确实没有解释清楚,因为这不是一句话的事,而且要说的东西我也不是很清楚。
这是function是如何运行的问题,放到哪里都会这样运行,和“匿名”、“闭包”没有关系。
闭包内的微观世界
http://hi.baidu.com/netwolf103/blog/item/4163bb3443afbc335bb5f5e3.html
[code="java"]
var MyNamespace = {};
MyNamespace.TreeItem = (function()
{
var numTreeItems = 0;
function counter()
{
numTreeItems ++;
console.log("Created "+numTreeItems+" tree items!");
//alert(numTreeItems);
}
return counter;
})();
var treeItem1 = new MyNamespace.TreeItem();
var treeItem2 = new MyNamespace.TreeItem();
[/code]
这段代码是有些问题的,
MyNamespace.TreeItem = (function()
{
.....
})();
MyNamespace.TreeItem本身是一个函数的结果,而不是函数。把后面那个()去掉就可以了。