js的变量的问题

chinajpr 2017-02-08 02:08:13
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="keyword" content="布尔教育">
<title>Document</title>
</head>
<body>
<button>红</button>
<button>绿</button>
<button>黄</button>
<script>
var btn=document.getElementsByTagName('button');
for(var j=0;j < 3;j++){
btn[j].onclick = function(){
alert(j);
}
}

</script>
</body>
</html>

提问:以上代码,居然j能打印出3来,莫名奇妙?
...全文
207 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2017-02-08
  • 打赏
  • 举报
回复
引用 6 楼 wuqinfei_cs 的回复:
JavaScript没有局部作用域的概念, 你那段代码等价于:
<script>
var btn = document.getElementsByTagName( 'button' );
var j;
for( j = 0; j < 3; j++ ) {
    btn[ j ].onclick = function(){
        alert( j );
    };
}
</script>
变量j其实是全局变量,你通过 window.j 是可以访问得到的。 JavaScript代码执行是很快的, 当你触发点击事件后,j的值早就等于3了。 那怎么模拟局部变量呢,函数的参数就是局部变量:
var btn = document.getElementsByTagName( 'button' );
var j;
for( j = 0; j < 3; j++ ) {
    +function( _j ){
        btn[ _j ].onclick = function(){
            alert( _j );
        };    
    } ( j );
}
至于闭包什么的,我说不清楚。
es6版本有局部作用域 for(let j=0;j < 3;j++){
forwardNow 2017-02-08
  • 打赏
  • 举报
回复
JavaScript没有局部作用域的概念, 你那段代码等价于:
<script>
var btn = document.getElementsByTagName( 'button' );
var j;
for( j = 0; j < 3; j++ ) {
    btn[ j ].onclick = function(){
        alert( j );
    };
}
</script>
变量j其实是全局变量,你通过 window.j 是可以访问得到的。 JavaScript代码执行是很快的, 当你触发点击事件后,j的值早就等于3了。 那怎么模拟局部变量呢,函数的参数就是局部变量:
var btn = document.getElementsByTagName( 'button' );
var j;
for( j = 0; j < 3; j++ ) {
    +function( _j ){
        btn[ _j ].onclick = function(){
            alert( _j );
        };    
    } ( j );
}
至于闭包什么的,我说不清楚。
天际的海浪 2017-02-08
  • 打赏
  • 举报
回复
事件执行时,for循环早就结束了,这个时候i已经是最大值加1了。 解决方法是用闭包把每次循环i的值保存起来
  • 打赏
  • 举报
回复
楼主这块代码还没出现闭包,只是如果想要点击按钮依次显示123就要用到闭包来处理。
  • 打赏
  • 举报
回复
楼主这块代码还没出现闭包,只是如果想要点击按钮一次显示123就要用到闭包来处理。
Jacie_chao 2017-02-08
  • 打赏
  • 举报
回复
以上代码执行结果就是3,没有错。 原因在于for循环中变量i值为3时跳出循环,所以最终j值为3,按钮的onclick事件方法中,j的值随着for循环的执行在改变。所以只能打印出最终值3
yibey 2017-02-08
  • 打赏
  • 举报
回复
楼上去理解一下闭包就知道了。JS是顺序执行的,所以当你绑定完时间后j=3

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧