锁定老帖子 主题:javascrpt竞答,进来看看了
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-30
<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> 请大家我答案按序号写明白。如果回答了,也说出理由供大家学习 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-03-30
第一答案是 0 1 2
(function(){})(); 这样的形式表示一开始就运行function这个匿名函数,而无需外部调用.所以uniqueID = function() { return id++; }; 但id是引用外部的var变量.所以外部的var一直没法给内存回收. 所以每次return id的时候,就会在内存里面寻找id这个变量. 最后将它返回给调用函数 |
|
返回顶楼 | |
发表时间:2008-03-30
第2答案是 function() { return id++; };
将一个内部的匿名函数的引用作为结果返回 第3是function() { var id = 0; return function() { return id++; }; }; UniqueId就是 对function的引用.所以输出来就是function的结构体 第4 同第1 其实就是将原先的匿名函数,分配了函数名 |
|
返回顶楼 | |
发表时间:2008-03-30
第5 应该有错 ..过程类似第1 . 但它返回的是一个数字 uniqueID = 0 . 所以uniqueID()是出错D
第6 0 解释同 5 第7 将function结构体输出 |
|
返回顶楼 | |
发表时间: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不被回收), 累加器得以实现。 |
|
返回顶楼 | |
发表时间: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 对象 |
|
返回顶楼 | |
发表时间: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属性,方法对象 |
|
返回顶楼 | |
发表时间: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,执行期永不被回收,实现记数器 |
|
返回顶楼 | |
发表时间: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”,而不是方法对象,所以不能被“()”执行。报错 |
|
返回顶楼 | |
发表时间: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” |
|
返回顶楼 | |