`
woweiwokuang
  • 浏览: 19842 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascrpt竞答,进来看看了

    博客分类:
  • ext
阅读更多
第一:
<script>
uniqueID = (function() {  
    var id = 0;          
   
    return function() { return id++; };
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

第二:
<script>
uniqueID = function() {  
    var id = 0;          
   
    return function() { return id++; };
};

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

第三:
<script>
uniqueID = function() {  
    var id = 0;          
   
    return function() { return id++; };
};

alert(uniqueID);
alert(uniqueID);
alert(uniqueID);
</script>

第四:
<script>
var uniqueID = (function() {  
    var id = 0;          
    var inft = function() { return id++; }
    return inft;
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

第五:
<script>
var uniqueID = (function() {  
    var id = 0;          
    var inft = function() { return id++; }
    return inft();
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

第六:
<script>
var uniqueID = (function() {  
    var id = 0;          
    var inft = function() { return id++; }
    return inft();
})();

alert(uniqueID);
alert(uniqueID);
alert(uniqueID);
</script>

第八:
<script>
var uniqueID = function() {  
    var id = 0;          
    var inft = function() { return id++; }
    return inft();
};

alert(uniqueID);
alert(uniqueID);
alert(uniqueID);
</script>


请大家我答案按序号写明白。如果回答了,也说出理由供大家学习
分享到:
评论
18 楼 xiajiqiu 2012-08-07  
稍微整理了一下,贴出来和大家分享,如有不对,请大家批评指正
// 第一:闭包(closure)
// 理解闭包的关键:函数定义时的作用域链到函数执行时也是有效的,也就是说,随着函数的定义结束,作用域链也就定义结束了,以后都不会改变
// 注意:这里的作用域链关系是在函数定义的时候确定的,但实际上创建这个作用域链实在函数第调用的时候,没调用一次这个函数都会创建一个作用域链
<script>
uniqueID = (function() { // 返回的是一个函数,并且定义的时候就第一次调用了,创建了一个作用域链,以后的uniqueID调用使用的都是同一个id
var id = 0;
return function() {
return id++;
};
}
)();

alert(uniqueID()); // => 0
alert(uniqueID()); // => 1
alert(uniqueID()); // => 2
</script>

// 第二:
<script>
uniqueID = function() {  // 只是定义了一个静态的函数,每次调用都会创建id,因为每次调用使用的是不同的作用域链
    var id = 0;         
  
    return function() { return id++; }; // 该函数返回一个函数
};

alert(uniqueID()); // function()
alert(uniqueID()); // function()
alert(uniqueID()); // function()
</script>

第三:
<script>
uniqueID = function() { 
    var id = 0;         
  
    return function() { return id++; }; // 返回的依然是函数
};

alert(uniqueID); // => function()
alert(uniqueID); // => function()
alert(uniqueID); // => function()
</script>

第四:
<script>
var uniqueID = (function() {  // 在定义的时候就调用,说明产生了唯一的作用域链,以后再调用uniqueID的时候就是同一个id变量
    var id = 0;         
    var inft = function() { return id++; } // 返回了一个方法并执行了
    return inft;
})();

alert(uniqueID()); // => 0
alert(uniqueID()); // => 1
alert(uniqueID()); // => 2
</script>

第五:
<script>
var uniqueID = (function() { 
    var id = 0;         
    var inft = function() { return id++; }
    return inft(); // 在这里返回的是一个数值
})();

alert(uniqueID()); // 返回的不是一个函数,报错
alert(uniqueID());
alert(uniqueID());
</script>

第六:
<script>
var uniqueID = (function() {  // 因为返回的是一个数字,所以,虽然是同一个作用域链,但是在执行alert(uniqueID)的时候
    var id = 0;          // 并没有继续执行方法,所以并没有加
    var inft = function() { return id++; }
    return inft();
})();

alert(uniqueID); // => 0
alert(uniqueID); // => 0
alert(uniqueID); // => 0
</script>

第八:
<script>
var uniqueID = function() {  // 很明显返回的是一个函数,可是每次调用的时候都会创建一个新的作用域链,因此每次都会创建一个id变量
    var id = 0;          // 因此调用uniqueID()返回值永远是0
    var inft = function() { return id++; }
    return inft();
};

alert(uniqueID); // => function()
alert(uniqueID); // => function()
alert(uniqueID); // => function()
</script>
17 楼 xwhoyeah 2008-04-07  
厉害! 
各位是从那里了解到这么多内容的?
推荐一本书目可否?
16 楼 leo_faith 2008-04-01  
Soory,看出来了,一个是返回的函数,一个返回的是值!
15 楼 leo_faith 2008-04-01  
  第四和第五的区别没看出来!请指点下!
14 楼 gdipkf1986 2008-04-01  
第一个括号可以去掉.function(){}本身就是一个完整的匿名函数.
13 楼 dboylx 2008-04-01  
第一个扩号可以去掉,因为JS引擎会先定义边的Function然后再去用“()”去执行。
12 楼 dboylx 2008-04-01  
第一个扩号是优先分组定义一个当前作用域下的一个属性
第二个扩号是在当前作用域执行该属性, 如果此属性不是一个方法对象会有报错.
11 楼 xwhoyeah 2008-03-31  
弱弱的问一句,下面的的两对括号是什么意思?

uniqueID = (function() {
var id = 0;

return function() { return id++; };
})();

10 楼 dboylx 2008-03-31  
第六题:
<script>
var uniqueID = (function() {
var id = 0;
var inft = function() { return id++; }
return inft();
})();

alert(uniqueID);
alert(uniqueID);
alert(uniqueID);
</script>

与第五题同理,运行时输出当前作用域下的uniqueID属性“0”
9 楼 dboylx 2008-03-31  
第五题:
<script>
var uniqueID = (function() {
var id = 0;
var inft = function() { return id++; }
return inft();
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

1,运行一个匿名方法
2,初始化局部属性. 生成一个匿名方法闭包,对其父作用域一个对象的引用。(此对象与所引用对象在此例中生命周期相等)
3,inft 保存局部匿名函数一个引用
4,执行inft方法,返回“0”原对象。
5, 方法动作结束,查询inft局部对象引用counter为0时回收对象,inft的回收导至局部的id引用减1,id引用counter为0触发回收操作。
3, 返回结果“0”传值到当前作用域的uniqueID里。
2,由于当前作用域下的uniqueID是原数据“0”,而不是方法对象,所以不能被“()”执行。报错
8 楼 dboylx 2008-03-31  
第四题:
<script>
var uniqueID = (function() {
  var id = 0;
  var inft = function() { return id++; }
  return inft;
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

1,运行一个匿名方法
2,初始化局部属性,并返回一个局部对象(inft)引用给调用者,其中inft作用域内有对父作用域的 id属性引用(id引用counter = 1),所以在结束方法后父作用域的id不被回收。
3, 把方法运行返回引用绑定到当前作用域的uniqueID上。
2,当前作用域下调用uniqueID方法,由于执行期id属性引用counter永等于1,执行期永不被回收,实现记数器
7 楼 dboylx 2008-03-31  
第三题: 
<script>
uniqueID = function() {
  var id = 0;
  return function() { return id++; };
};

alert(uniqueID);
alert(uniqueID);
alert(uniqueID);
</script>

1,生名一个Function 对象uniqueID到当前作用域下
2,以属性方式查询当前作用域下的uniqueID属性,方法对象
6 楼 dboylx 2008-03-31  
第二题:
<script>
uniqueID = function() {
  var id = 0;
  return function() { return id++; };
};
alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
</script>

1,生名一个Function 对象uniqueID到当前作用域下
2,执行这个方法,最后返回一个Function 对象
5 楼 dboylx 2008-03-31  
第一题:
uniqueID = (function() {
   var id = 0;
   return function() { return id++; };
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());

1,在定义一个匿名Function后立即运行此方法,产生闭包1放在window作用域下,引用计数器加1,运行后不被回收。
2,定义一个局部id变量(不能被外界直接访问)
3,返回一个匿名Function,可以被外作用域直接访问,此方法内有一个对闭包1中的一个局部属性的引用,此id对象引用计数器加1.
4,由于返回的匿名方法持有闭包1中的id引用(id局部变量引用Counter>0不被回收), 累加器得以实现。
4 楼 woweiwokuang 2008-03-30  
好不错啊!
3 楼 kevinsai 2008-03-30  
第5 应该有错 ..过程类似第1 . 但它返回的是一个数字 uniqueID = 0 . 所以uniqueID()是出错D

第6  0 解释同 5

第7 将function结构体输出
2 楼 kevinsai 2008-03-30  
第2答案是  function() { return id++; };
将一个内部的匿名函数的引用作为结果返回


第3是function() {
var id = 0;

return function() { return id++; };
};

UniqueId就是 对function的引用.所以输出来就是function的结构体


第4 同第1
其实就是将原先的匿名函数,分配了函数名

1 楼 kevinsai 2008-03-30  
第一答案是 0 1 2
(function(){})(); 这样的形式表示一开始就运行function这个匿名函数,而无需外部调用.所以uniqueID = function() { return id++; };  但id是引用外部的var变量.所以外部的var一直没法给内存回收. 所以每次return id的时候,就会在内存里面寻找id这个变量. 最后将它返回给调用函数

相关推荐

Global site tag (gtag.js) - Google Analytics