javascript-js 回调函数的一个疑惑

问题描述

js 回调函数的一个疑惑

$(document).ready(function(){
for(var i = 0 ; i < 5; i++){
$("#b"+i).bind("click",function(){
alert(i);
});
}
});

This is a paragraph.

请点击这里0
请点击这里1
请点击这里2
请点击这里3
请点击这里4

代码如上,很简单的一个循环。但是为什么这5个button点击后都是alert出5呢
为什么不是0,1,2,3,4呢?难道是回调的执行顺序的问题?求大神解答

解决方案

@wuheng_1 正解
这是闭包法则带来的结果。

$(document).ready(
    function(){
            //形成闭包
            for(var i = 0 ; i < 5; i++){
                //在这里定义了变量i
                $("#b"+i).bind("click",function(){
                        //内部函数调用了变量i
                        alert(i);
                    });
            }
            //假如在这里继续改变i的值,那么你会发现alert的值继续发生改变
        });
//问题的关键在于内部方法使用了外部方法的变量i

就这个问题而言,当然是有解决办法的,思路1,放弃id选择器,把id当成一个属性,然后利用startWith过滤器选择到这些东西,然后each枚举通过解析id的具体值来完成事件的绑定。
思路2,定义一个返回值为function的js方法,然后把i作为参数传进去。然后在绑定中调用此方法获取绑定事件的具体执行方法(可能说的不是很清楚,直接函数片段)

//思路一
$("*[id^='b']).each(function(index, data){
    var i = $(data).id().substring(1);
    $(data).bind("click", function(){alert(i);});
});
 //思路二
 function(){
            var getFun = function(canshu){return alert(canshu);};
            for(var i = 0 ; i < 5; i++){
                $("#b"+i).bind("click", getFun(i));
            }
        });

解决方案二:

如何写回调函数?

? 如果自己在写一个方法或函数,你有可能会遇到需要一个回调函数。下面就是一个简单的常见回调函数例子:

function mySandwich(param1, param2, callback) {

alert('Started eating my sandwich.

It has: ' + param1 + &#......
答案就在这里:一个js 回调函数

解决方案三:

因为alert中是用的变量i,i最后等于5。

时间: 2025-01-01 20:11:57

javascript-js 回调函数的一个疑惑的相关文章

关于Javascript回调函数的一个妙用_javascript技巧

前言 其实回调函数简单通俗点就是当有a和b两个函数,当a作为参数传给b,并在b中执行,这时a就是一个回调(callback)函数,如果a是一个匿名函数,则为匿名回调函数那下面们来通过一个实例来具体解释下Javascript回调函数怎么使用. 实例 在很久很久以前,有一个人. var person; 他是个人,也就是一个对象. person= {}; // 在JavaScript中,花括号就代表是一个对象 他有个名字叫小明. person.name = '小明'; 看一下是不是真的叫小明. ale

javascript的回调函数应用示例

 回调函数就是一个通过函数指针调用的函数.下面以示例的方式为大家介绍下其具体的使用 回调函数概念:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.    JS Api 里这样解释:A callback is a function that is passed as an argument to another function and is executed after its parent

node.js回调函数之阻塞调用与非阻塞调用_node.js

首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善.其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者服务器端的javascript代码交给node.js来执行,让我们前端人也能作用于后台,相比之下,浏览器端的javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限,而node.js则是一个全面的后台运行时,为javascript提

告诉你什么是javascript的回调函数_基础知识

函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串包含函数的javascript代码.假如你是从C语言或者java语言转过来的,这也许看起来很奇怪,代码怎么可能是字符串?但是对于javascript来说,这很平常.数据和代码之间的区别是很模糊的. //可以这样创建函数 var fn = new Functio

详解JavaScript的回调函数_javascript技巧

本文的目录: 什么是回调或高级函数 回调函数是如何实现的 实现回调函数的基本原则 回调地狱的问题和解决方案 实现自己的回调函数 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我

谈谈JavaScript自定义回调函数_javascript技巧

废话不多说了,直接给大家贴代码了. 背景分析 首先看一段js的代码,主要实现添加的时候首先通过异步请求判断是否存在,如果不存在的话,在进行添加操作: function add(url,data) { var isExited = isExited(data); if(!isExited){ addRequest(url, data); } } 当我添加一个数据的时候,我首先通过判断是否在数据库中存在(当然,如果前后台彻底分离的话,不应该前端进行业务逻辑的判断,前端只应该,用来展示数据),首先,i

javascript的回调函数应用示例_javascript技巧

回调函数概念:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. JS Api 里这样解释:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 使用回调函数的原因:可以把调用者与被调用者

javascript带回调函数的异步脚本载入方法实例分析

  本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequire

javascript带回调函数的异步脚本载入方法实例分析_javascript技巧

本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequired = scripts.length; this.callback = callback; for (var i = 0; i < scri