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

  最近在闲逛校园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);
        }
    });
}

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

  

  看到输出结果一下子就反应过来了:函数队列。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);
    );
}

  运行结果:

  

  相关解释:

    通过把回调写成匿名函数闭包的形势,将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.还没想好怎么说,以后再补

       

时间: 2024-10-06 16:58:07

[js]利用闭包向post回调函数传参数的相关文章

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

最近在闲逛XX站的时候,打算搞个破坏,试试有多少人还是用初始密码登陆.比较懒,所以直接打开控制台来写. 所以问题可以描述为: 向后端不断的post数据,id从1~5000自增,后端会根据情况来返回值res,需要把res=100的id输出. 最简单的想法是:for循环内部调用post数据 //错误示范 一 for(var i = 92000;i<92500;i++){ //直接借用一下网站内引用的jq $.post("login.php", { ts:"login&quo

js简单封装能向回调函数传入参数的事件处理函数

<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <input type="text" id="fInp"/> <script> var eventRegister = function(dom,

Chrome和Firefox浏览器执行new Date() 函数传参数得到不同结果的陷阱

某日,同事问到关于new Date() 函数传参数,在火狐浏览器和谷歌浏览器控制台运行,会得到不同的结果,刚开始觉得不可能,后来实际操作才发现此陷阱 var date = new Date('2014-07-25T23:00:00'); alert(date); 在火狐浏览器返回的是: Date {Fri Jul 25 2014 23:00:00 GMT+0800} 火狐浏览器版本(通过navigator.userAgent输出):"Mozilla/5.0 (Windows NT 6.1; WO

js利用闭包封装自定义模块的几种方法

1.自定义模块: 具有特定功能的js文件 将所有的数据和功能都封装在一个函数的内部 只向外暴露一个包含有n个方法的对象或者函数 模块使用者只需要通过模块暴露的对象调用方法来实现相对应的功能 1.利用函数方法自调用 /** * Created by lonecloud on 2017/9/10. */ (function (window) { var DEBUG="debug" /** * 打印日志 * @param args */ function log(args) { consol

PHP之回调函数传参(解决eval函数拼接对象参数的问题)

在使用Smarty时,定义了一个统一调用控制器的函数,如下: function C($name, $method){//控制器的名称和其中方法的名称 require_once "controller/".$name."Controller.class.php";//引入控制器 eval('$obj = new '.$name.'Controller();$obj->'.$method.'();');//实例化控制器并调用方法 } 但是该函数只能调用控制器中无参

js小知识-replace的回调函数

replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串.模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数. 注意:原字符串不会改变. 语法 str.replace(regexp|substr, newSubStr|function) 参数 regexp (pattern) 一个RegExp 对象或者其字面量.该正则所匹配的内容会被第二个参数的返回值替换掉. substr (pattern) 一个要被 newSubStr 替换的字

Javascript AJAX回调函数传递参数

在Javascript 中,特别是在AJAX中,回调函数常常是一个函数名,没有地方放入参数,如下面的AJAX代码,在成功后将调用回调函数callback,但callback是有参数的,如何把参数传进来呢? var callback = function(p1){ //do something } var ajaxSetting = { url: url, timeout:me.timeout, type: method, contentType: "application/json",

Jquery中淡入淡出效果fadeIn()、fadeOut()、fadeToggle()、fadeTo()学习引发的思考----关于Jquery函数传参数

一.基本语法 1.fadeIn淡入.fadeOut淡出.fadeToggle淡入淡出切换(已经淡出点击淡入,或者相反): $(selector).fadeIn(duration,complete); $(selector).fadeOut(duration,complete); $(selector).fadeToggle(duration,complete); 可选的 speed 参数规定效果的时长.它可以取以下值:"slow"(200ms)."fast"(600

利用call与apply向函数传递参数

Js中函数对象都有call与apply两个方法属性,二者使用方法和功能一样,只是传递参数的格式不同,call逐个传递单个参数,apply一次性传递一个参数数组. 这两个方法可以改变函数的调用对象,并且向函数中传递参数.如: function send(str,speak){ speak.call(this,str); //send(~)==window.speak(str),这句话会立即调用执行此函数 } send("你好!",function(strword){ //这里以匿名函数对