回调函数

原生js深入理解系列(七)--- 读JavaScript 执行机制的一点小总结

微笑、不失礼 提交于 2020-03-24 20:30:40
3 月,跳不动了?>>> 总结: js的执行机制是:单线程运行,主线程跑任务,线程队列一个一个宏任务来运行,并且把宏任务内的微任务的全部运行完再继续下一个宏任务。 首先是同步执行其次是异步执行 除了广义的同步任务和异步任务,我们对任务有更精细的定义: macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTick(promise的回调then()是微任务) 主线程里立即执行的是:new promise, promise 语句, console.log 按出现的先后执行 立即执行的执行完后执行同一个宏任务里的微任务队列,微任务依次执行完毕后再继续下一个宏任务。下面请看掘金作者ssssyoki大佬的娓娓道来,为我们彻底的细致的理解js的执行机制。 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了

这一次,彻底弄懂 JavaScript 执行机制

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-24 20:20:23
3 月,跳不动了?>>> 点点这个链接免费获取: 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 本文的目的就是要保证你彻底弄懂JavaScript的执行机制,如果读完本文还不懂,可以揍我。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了:我难道不知道js是一行一行执行的?还用你说?稍安勿躁,正因为js是一行一行执行的,所以我们以为js都是这样的: let a = '1' ; console .log(a); let b = '2' ; console .log(b); 然而实际上js是这样的: setTimeout( function () { console .log( '定时器开始啦' ) }); new Promise ( function ( resolve ) { console .log( '马上执行for循环啦' ); for ( var i = 0 ; i < 10000 ; i++){ i == 99 && resolve(); } }).then( function () { console .log(

Jq学习笔记(7)JQ动画

僤鯓⒐⒋嵵緔 提交于 2020-03-24 06:42:24
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 开发人员一直痛疼做动画. 但是有了jQuery你会瞬间成为别人(那些不知道jQuery的人)眼里的动画高手! 本文将介绍jQuery的动画相关函数.原来做动画如此简单! 二.前言 本系列文章的实例都是针对某一个技术细节的, 因为我们要学习的是基础知识, 虽然总有人希望要复杂一些的应用示例, 但是我想还是让我们先把基础打牢, 有了扎实的基础凭借每个人的智慧一定能创造出更多更好的应用. 就在写这篇文章的前几天, 还有不止一个同事在为了"弹出层"效果而犯愁. 但是以后再面对这样的功能看过本篇文章的每一个人都可以开心的微笑了. jQuery, make work easy ! 三.从实例开始 做web程序经常要使用弹出层, 比如单击文字或按钮显示一段提示文字等. 假设有如下需求: 单击图中的"显示提示文字"按钮, 在按钮的下方显示一个弹出层. 单击任何空白区域或者弹出层,弹出层消失. 用原始javascript我们也完全可以完成这个工作. 有以下几点注意事项: 1. 弹出层的位置需要动态计算. 因为触发弹出事件的对象可能出现在页面的任何位置, 比如截图中的位置. 2. 为document绑定单击是关闭弹出层的函数, 要使用多播委托,

Zepto事件模块源码分析

风格不统一 提交于 2020-03-23 08:14:02
Zepto事件模块源码分析 一、保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数。而Zepto则可以不传入回调函数,直接移除对应类型的所有事件。原因就在于Zepto在绑定事件时,会把相关的数据都保存到 handlers 对象中,因此就可以在这个变量中查找对应事件的回调函数,来移除事件。 handlers 对象的数据格式如下: { 1: [ // handlers的值为DOM元素的_zid { del: function() {}, // 实现事件代理的函数 e: "click", // 事件名称 fn: function() {}, // 用户传入的回调函数 i: 0, // 该对象在数组里的下标 ns: "", // 事件的命名空间,只用使用$.fn.triggerHandler时可用,$.fn.trigger不能使用。 proxy: function(e) {}, // 真正绑定事件时的回调函数,里面判断调用del或者fn sel: undefined // 要进行事件代理时传入的selector } ] } 二、绑定事件 主要流程图 流程说明 处理参数实现函数重载 实现函数重载的重点就是判断参数的类型,处理参数: // 处理参数,实现函数重载 if (!isString(selector) && !isFunction

[ 转 ]jquery的ajax和getJson跨域获取json数据

耗尽温柔 提交于 2020-03-23 02:39:29
目前浏览器端跨域访问常用的两种方法有两种: 1、通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的。 jsonp是英文json with padding的缩写。它允许在服务器端生成script tags至返回至客户端,也就是动态生成javascript标签,通过javascript callback的形式实现数据读取. html代码: 1 //首先要引入jquery的js包 2 jQuery(document).ready(function(){ 3 $.ajax({ 4 type : "get", //jquey是不支持post方式跨域的 5 async:false, 6 url : "http://api.taobao.com/apitools/ajax_props.do", //跨域请求的URL 7 dataType : "jsonp", 8 //传递给请求处理程序,用以获得jsonp回调函数名的参数名(默认为:callback) 9 jsonp: "jsoncallback", 10 //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名 11 jsonpCallback:"success_jsonpCallback", 12 //成功获取跨域服务器上的json数据后,会动态执行这个callback函数 13 success :

select、poll、epoll之间的区别总结[整理]

冷暖自知 提交于 2020-03-22 23:42:20
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。关于这三种IO多路复用的用法,前面三篇总结写的很清楚,并用服务器回射echo程序进行了测试。连接如下所示: select: http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html poll: http://www.cnblogs.com/Anker/archive/2013/08/15/3261006.html epoll: http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html   今天对这三种IO多路复用进行对比,参考网上和书上面的资料,整理如下: 1、select实现 select的调用过程如下所示: (1)使用copy_from_user从用户空间拷贝fd_set到内核空间 (2)注册回调函数__pollwait (3)遍历所有fd

ffmpeg 内存读写相关

↘锁芯ラ 提交于 2020-03-22 15:36:30
需要的解码的视频数据在一段内存中。例如,通过其他系统送来的视频数据。同样,有的时候编码后的视频数据也未必要保存成一个文件。例如,要求将编码后的视频数据送给其他的系统进行下一步的处理。以上两种情况就要求FFmpeg不仅仅是对文件进行“读,写”操作,而是要对内存进行“读,写”操作。 从内存中读取数据 经过 分析ffmpeg的源代码 ,发现其是可以从内存中读取数据的: AVFormatContext *ic = NULL; ic = avformat_alloc_context(); unsigned char * iobuffer=(unsigned char *)av_malloc(32768); AVIOContext *avio =avio_alloc_context(iobuffer, 32768,0,NULL,fill_iobuffer,NULL,NULL); ic->pb=avio; err = avformat_open_input(&ic, "nothing" , NULL, NULL); 关键要在avformat_open_input() 之前 初始化一个AVIOContext, 而且将原本的AVFormatContext的指针pb(AVIOContext类型)指向这个自行初始化的AVIOContext。当自行指定了AVIOContext之后,avformat

javascript的数组之reduce()

泪湿孤枕 提交于 2020-03-21 14:27:08
reduce()方法对累加器和数组中的每个元素(从左到右)应用到一个函数中,最终得到一个值并返回 1 const array1 = [1, 2, 3, 4]; 2 const reducer = (accumulator, currentValue) => accumulator + currentValue; 3 4 // 1 + 2 + 3 + 4 5 console.log(array1.reduce(reducer)); 6 // expected output: 10 7 8 // 5 + 1 + 2 + 3 + 4 9 console.log(array1.reduce(reducer, 5)); 10 // expected output: 15 参数: 第一个:callback回调函数(accumulator, currentValue, currentIndex, array) 第二个:initalValue初始值,作为第一个执行回调函数的accumulator值,reduce的index初始索引为0。如果没有initalValue,则使用数组第一个元素作为accumulator值,并且从第二个元素开始执行回调函数,此时reduce初始索引为1。 返回值:函数累计的数组元素叠加值。 来源: https://www.cnblogs.com

Twisted 延迟调用

十年热恋 提交于 2020-03-21 05:42:36
延迟(defer)是twisted框架中实现异步的编程体系,使程序设计可以采用事件驱动的机制 1、基本使用 defer可以看作一个管理回调函数的对象,可以向该对象添加需要的回调函数同时也可以指定该组函数何时被调用 from twisted.internet import reactor,defer from twisted.python import failure import sys d = defer.Deferred() # 定义defer实例 #####################函数添加阶段 def printSquare(d): # 正常处理函数 print('square of %d id %d '% (d,d*d)) def processError(f): print('error when process') d.addCallback(printSquare) # 添加正常处理回调函数 d.addErrback(processError) # 添加错误处理回调函数 ################defer调用阶段 if sys.argv[1] =='call_error': f= failure.Failure(Exception('my exception')) d.errback(f) # 调用错误处理函数 else: d.callback(4)

爬虫之线程&协程&异步

空扰寡人 提交于 2020-03-20 23:23:55
线程池 导包: from multiprocessing.dummy import Pool 回调函数异步将可迭代对象中的元素进行某种操作 注意事项:callback必须有一个参数,且只能有一个参数 异步主要是被应用在耗时的操作 from multiprocessing.dummy import Pool pool = Pool(3) # 实例化线程池对象,3是线程池的最大线程数 # 参数1:回调函数(只是函数名,不加括号);参数2:列表 # 参数1会接收参数2列表中的某一个元素,回调函数可以对该列表元素进行某种操作 pool.map(callback,list) 测试:同步&异步效率 搭建一个flask,自己启动服务,测试执行时间 新建一个 server.py from flask import Flask, render_template import time app = Flask(__name__) @app.route('/xx') def index_1(): time.sleep(2) return render_template('test.html') @app.route('/yy') def index_2(): time.sleep(2) return render_template('test.html') @app.route('/oo') def