jquery - javascript for in 与 $().bind结合出现奇怪的问题!
高洛峰
高洛峰 2017-04-10 14:51:19
[JavaScript讨论组]

问题

函数 bindInputBlur() 绑定输入框的输入内容格式限制,但是用了for in 来循环绑定 bind ,结果却发现 当触发 input.bind-emailonblur事件的时候,触发的是 arrRegExp 的最后一个 bind-hobby 而不是 bind-email

代码




    
    
    
    











高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
PHPz

教科书式的闭包问题+1

因为是过来人,所以给你举个简单易懂的例子,如果你想了解闭包的更多知识,请阅读闭包在 JavaScript 中的解释。

// 以下代码不会像你期望的那样工作,因为变量‘i’没有被锁定,每次点击
// 时警示窗都会显示全部的元素数目,因为在那个点上它正是变量‘i’的值

var elems = document.getElementsByTagName( 'a' );

for ( var i = 0; i < elems.length; i++ ) {

elems[ i ].addEventListener( 'click', function(e){
e.preventDefault();
alert( '我是链接 #' + i );
}, 'false' );

}

// 以下的代码可以达到我们的目的,在这个 IIFE 闭包中,变量‘i’像一个
// ‘锁定索引’被锁在其中。当循环结束执行时,尽管变量‘i’的值是元素的总数
// 但在 IIFE 闭包中,‘锁定索引’的值总是当时方法被调用时传入的‘i’值,因此
// 当一个链接被点击时,警示窗就会显示正确的值了。

var elems = document.getElementsByTagName( 'a' );

for ( var i = 0; i < elems.length; i++ ) {

(function( lockedInIndex ){

elems[ i ].addEventListener( 'click', function(e){
e.preventDefault();
alert( '我是链接 #' + lockedInIndex );
}, 'false' );

})( i );

}

// 你也可以像这样使用一个 IIFE,虽然效果相同,但我觉得上面的写法可读性更高。

var elems = document.getElementsByTagName( 'a' );

for ( var i = 0; i < elems.length; i++ ) {

elems[ i ].addEventListener( 'click', (function( lockedInIndex ){
return function(e){
e.preventDefault();
alert( '我是链接 #' + lockedInIndex );
};
})( i ), 'false' );

}

参考链接

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号