Readers: 0 | Updated: 07-17

Javascript 每日测试 - 第九期

Translate Into:

今天的题目“看起来”没有任何的悬念。

请问点击第三个链接时弹出的值?  <div id="demo">     <a href=http://item.feedsky.com/~feedsky/gracecode/~6159402/93957259/1221433/1/"#">A</a>     <a href="#">B</a>     <a href="#">C</a>     <a href="#">D</a> </div>  <script type="text/javascript"> var addHandlers = function(nodes) {     for (var i = 0; i < nodes.length; ++i) {         nodes[i].onclick = function(ev) {             alert(i * 100);         }     } }  addHandlers(document.getElementById('demo').getElementsByTagName('a'));

“很不幸”的是,上述的这段代码没有按照原意实现,点击它们所有的链接都是为 400。这是因为“点击以后执行 i * 100 ,而这个 i 是循环结束以后的值,按照上面的循环后值为 4”。

如果按照期望的写法,也就是点击链接以后 alert 不同的值,可以用闭包。比如下面有几个解决方案

var addHandlers = function(nodes) {     for (var i = 0; i < nodes.length; ++i) {         (function () {          var j = i * 100;             nodes[i].onclick = function(ev) {                 alert(j);             }         }) ();     } }

期前也讨论过,只不过那时还没有了解闭包,详细”。类似的题目,在《精通 Javascript》中 23 页(中文版)有提及。

var addHandlers = function(nodes) {     for (var i = 0; i < nodes.length; ++i) {         nodes[i].onclick = function(idx) {             return function(ev) {                 alert(idx * 100);             }         }(i);     } }

“另,如果是使用 YUI 的话,可能会更直观些”

var addHandlers = function(nodes) {     for (var i = 0; i < nodes.length; ++i) {         YAHOO.util.Event.on(nodes[i], 'click', function(ev, idx) {             alert(idx * 100);         }, i);     } }

使用闭包的话,必须注意两点:其一,就是避免出现无谓的匿名函数;其二,就是注意内存溢出。下面有几条有关闭包的参考链接。


Gracecode.com Permalink Trackback Wap Rss



From The Blogs

Six Revisions

04-11
10 JavaScript Effects to Boost Your Website’s Fanciness Factor
There comes a point in time where we want to improve our website’s interface or provide a captivating experience that our users will remember. 查看全文

Six Revisions

04-11
40 Excellent Resources for JavaScript Coders
Are you an advanced JavaScript coder looking for more sites to sharpen your coding prowess? Maybe you’re a web designer wanting to double as a developer (or at least know enough to add a bit of rich c... 查看全文

WebTecker the latest Web Tech, Resources and News.

04-11
List of JavaScript Tab Navigation Scripts
This past weekend Ive been working on a free Premium WordPress theme for you.I was looking for a good tab navigation script to add to the theme.To allow for better navigation and to add a cool feature... 查看全文

Noupe

07-15
23+ Impressive Tools for Faster Javascript/Ajax Development
Javascriptapplications are still one of the most complex issues when it comes to web-development. Many tools and applications could make your developing life pretty fast and simple. Today we wanted to... 查看全文

Internet Observation

2007
马克布局,充分利用每寸空间,排版不再困难
CSS浮动布局可在800到1024像素的屏幕上运行,但是因为同时有多个设备进入网络,所以我们需要一个更强大、更稳定的方法来安排布局。如果我们要用每英寸72 到150 个像素的分辨率服务于240到约16... 查看全文

Internet Observation

2007
用Java脚本和CSS做出多条纹表格
2004年3月,David F. Miller在A List Apart网站上写了一篇题为《多条纹表格》的文章,他在文章中向大家介绍了一些使用DOM脚本的技巧。他的脚本为表格行加入了2种CSS背景色,... 查看全文

2007
Use different submit-buttons in javascript
hm, i don't like this solution for two reasons:  1. without java-script it won't work at all. I'm rather looking for a method that uses java script as add on but the buttons should work without it .  ... 查看全文

realazy

2007
JavaScript 数组的 uniq 方法
来自某个nb招聘的题目: 请给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。这是我的答案: 新解 Array.prot... 查看全文

realazy

2007
JavaScript风格要素
关于英文的写作有一本十分著名的书,The Elements of Style(风格要素),编写程序也有一本The Elements of Programming Style(编程风格要素)。证明了在某... 查看全文

realazy

2007
JavaScript文档生成工具
如果你看过YUI的RAW源码,会发现很多跟javadoc语法类似的注释。据说(via)是使用JSDoc这个工具。但我探索了一遍,发现YUI多出很多tag, 比如@namespace, @static之... 查看全文
More Articles
Elanso is a professional online platform which provides translation service for corporate or individule clients, opportunities for translation practice and translation jobs, and translation tool/software-download. Our online translators provide about 186 languages' translation service, including Japanese,Korean, French, German, Spanish, etc, among which, 20,000 are English translators. And some big translation service companies in Shanghai, Beijing, Nanjing also registered here.