文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>javascript整理、分析、提高、备忘(一)...

javascript整理、分析、提高、备忘(一)...

时间:2010-08-07  来源:tantan199

1、闭包

官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

2、作用域(scope)

In computer programming, scope is an enclosing context where values and expressions are associated. 中文即是所谓的 作用域, 它指明的是一个数值或者表达式所关联的上下文(能够被引用的执行空间).

3、实例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> <html xmlns="http://www.w3.org/1999/xhtml" > <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <head> <title>JAVASCRIPT</title> </head> <body> <noscript>请先运行执行JavaScript</noscript> <ul id="amy"> <li>应该弹出0</li> <li>应该弹出1</li> <li>应该弹出2</li> </ul> </body> </html> <mce:script type="text/javascript"><!-- var amy_li = document.getElementById("amy").getElementsByTagName("li"); var i=0,len=amy_li.length; while(i<len) { amy_li[i].onclick=function() { alert(i); }; i++; } // --></mce:script>

现在问题就出现每次点击amy(正在听amy winehouse的歌)的时候,并没有按照我们期望的那样弹出对应的数字,而都是弹出的3。
分析:作用域链,作用域链式在定义的时候就确定了的,i的作用域直接就是window,所以每次点击都相当于alert(window.i)
解决办法:
(1)、简洁的方法直接见i赋值给对象

while(i<len)
{
        amy_li[i].name=i;
        amy_li[i].onclick=function()
        {
                alert(this.name);                                                                                 
        };
        i++;
} 
其中amy_li[i].name=i可以换成任意属性,如amy_li[i].truei=i。
顺便说下this,看下面类似的情况
<input type="button" value="0" id="amy0"  /> 
<input type="button" value="1" id="amy1"  /> 
<input type="button" value="2" id="amy2"  onclick="whoiam();"/> 
<mce:script type="text/javascript"><!--
 
function whoiam()
{ 
        var who = (this === window) ? 'window' : this.id; 
        alert( who ); 
} 
document.getElementById('amy0').onclick = whoiam;
document.getElementById('amy1').onclick = function()
{    
        whoiam();    
}; 
// --></mce:script> 


(2)、利用闭包
有很多写法,多列些出来
写法1、
while(i<len)
{
        amy_li[i].onclick=new function()
        {
                var ii=i;
                return function()
                {
                        alert(ii);
                }
        };
        i++;
} 
写法2、 while(i<len) { amy_li[i].onclick=function() { var ii=i; return (function() { alert(ii); })() }; i++; }
写法3、 while(i<len) { amy_li[i].onclick=function() { var ii=i; return function() { alert(ii); } }(); i++; }
写法4、
while(i<len) { amy_li[i].onclick=function(j) { return function() { alert(j); } }(i++); }

第一篇技术博文就到这里草草结束,以后计划通过实际事例和大家分享


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载