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

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

  

  post函数时异步的进行请求,拿到请求之后才会执行回调函数。for循环执行速度要快于post函数的执行速度。当执行post之后,for循环不会等待post拿到res并执行回调,而是继续遍历,for循环几百几千次的速度都快于post。所以当第一个post请求去执行其回调时,循环已经结束,i=92500。

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

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++){
  (function(i){setTimeout(function(){
    console.log(i);
  },1000)})(i);
}

  

  对函数的一些理解:

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

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

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

       

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

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

    最近在闲逛XX站的时候,打算搞个破坏,试试有多少人还是用初始密码登陆.比较懒,所以直接打开控制台来写. 所以问题可以描述为: 向后端不断的post数据,id从1~5000自增,后端会根据情况来返回值r ...

  2. scrapy回调函数传递参数

    scrapy.Request 的callback传参的两种方式 1.使用 lambda方式传递参数 def parse(self, response): for sel in response.xpa ...

  3. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

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

    某日,同事问到关于new Date() 函数传参数,在火狐浏览器和谷歌浏览器控制台运行,会得到不同的结果,刚开始觉得不可能,后来实际操作才发现此陷阱 var date = new Date('2014 ...

  5. 关于main函数传参数的问题

    argc是命令行总的参数个数      argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数      命令行后面跟的用户输入的参数,比如:      int   main(int   ...

  6. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

  7. JS的闭包、高阶函数、柯里化

    本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...

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

    1.自定义模块: 具有特定功能的js文件 将所有的数据和功能都封装在一个函数的内部 只向外暴露一个包含有n个方法的对象或者函数 模块使用者只需要通过模块暴露的对象调用方法来实现相对应的功能 1.利用函 ...

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

    在使用Smarty时,定义了一个统一调用控制器的函数,如下: function C($name, $method){//控制器的名称和其中方法的名称 require_once "contro ...

随机推荐

  1. 超越Google,腾讯推出自研图片编码格式TPG

    近日,记者从国家知识产权局了解到,腾讯公司正式向国家知识产权局提交了一份关于图片编码技术的专利申请.此项专利被命名为TPG(Tiny Portable Graphics),在数据上TPG图片格式产生的 ...

  2. 最流行的JavaScript代码规范

    什么是最佳的JavaScript代码编程规范?这可能是一个众口难调的问题.那么,不妨换个问题,什么代码规范最流行? sideeffect.kr通过分析GitHub上托管的开源代码,得出了一些有趣的结果 ...

  3. Apache Hive (六)Hive SQL之数据类型和存储格式

    转自:https://www.cnblogs.com/qingyunzong/p/8733924.html 一.数据类型 1.基本数据类型 Hive 支持关系型数据中大多数基本数据类型 类型 描述 示 ...

  4. 游戏动作师使用Unity3D遇到过的所有问题

    http://blog.csdn.net/onafioo/article/details/50865169 http://www.gameres.com/thread_480489.html 文/拉撒 ...

  5. 大话CNN

    这几年深度学习快速发展,在图像识别.语音识别.物体识别等各种场景上取得了巨大的成功,例如AlphaGo击败世界围棋冠军,iPhone X内置了人脸识别解锁功能等等,很多AI产品在世界上引起了很大的轰动 ...

  6. Java-实体与集合转换

    import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...

  7. 安装运行okvis odometry

    源码链接https://github.com/ethz-asl/okvis 1. 安装依赖项 sudo apt-get install cmake sudo apt-get install libgo ...

  8. 全新的css网站布局--Grid布局

    Grid布局全新的css网站布局 CSS Grid 布局由两个核心组成部分是 wrapper(父元素)和 items(子元素). wrapper 是实际的 grid(网格),items 是 grid( ...

  9. Ubuntu 安装QT5 后编译程序报错: FindQt5Widgets.cmake

    安装QT5.4后,需要编译一个C++程序. Cmakelist 有find_package(Qt5Widgets REQUIRED),cmake 报错如下: CMake Error at CMakeL ...

  10. 设计模式(java)--观察者模式

    转自:卡奴达摩http://blog.csdn.net/zhengzhb/article/details/7471978?reload#reply 定义:定义对象间一种一对多的依赖关系,使得当每一个对 ...