
栈
函数调用形成堆栈帧。
function f(b){var a = 12;return a+b+35;}function g(x){var m = 4;return f(m*x);}g(21);当调用函数g时,创建第一个包含g参数和局部变量的帧。当g函数调用f函数时,创建包含f参数和局部变量第二个堆栈帧并推到第一个堆栈帧的顶部。当f返回时,顶部的堆栈帧元素被弹出(只留下g调用)。当g函数返回时,堆栈为空。while(queue.waitForMessage()){ queue.processNextMessage();}queue.waitForMessage同步等待一个消息。f1();f2();f3();如果f1中执行了大量的耗时操作,而且f2需要在f1之后执行。则程序可以改为回调的形式。如下:
function f1(callback){setTimeout(function () { // f1的大量耗时任务代码并的到三个结果i,l,you. console.log("this is function1"); var i = "i", l = "love", y = "you";if (callback && typeof(callback) === "function") {callback(i,l,y);}}, 50);}function f2(a, b, c) {alert(a + " " + b + " " + c);console.log("this is function2");}function f3(){console.log("this is function3");}f1(f2);f3();运行结果:this is function3this is function1i love youthis is function2采用这种方式,我们把同步操作变成了异步操作,f1不会堵塞程序运行,相当于先执行程序的主要逻辑,将耗时的操作推迟执行。
operation1(function(err, result) {operation2(function(err, result) {operation3(function(err, result) {operation4(function(err, result) {operation5(function(err, result) {// do something useful})})})})})四、事件监听// plain, non-jQuery version of hooking up an event handlervar clickity = document.getElementById("clickity");clickity.addEventListener("click", function (e) {//console log, since it"s like ALL real world scenarios, amirite?console.log("Alas, someone is pressing my buttons…");});// the obligatory jQuery version$("#clickity").on("click", function (e) {console.log("Alas, someone is pressing my buttons…");});也可以自定义事件进行监听,关于自定义事件,属于另外一部分的内容。这种方法的优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以"去耦合"(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。var pubsub = (function(){var q = {}topics = {},subUid = -1;//发布消息q.publish = function(topic, args) {if(!topics[topic]) {return;}var subs = topics[topic],len = subs.length;while(len--) {subs[len].func(topic, args);}return this;};//订阅事件q.subscribe = function(topic, func) {topics[topic] = topics[topic] ? topics[topic] : [];var token = (++subUid).toString();topics[topic].push({token : token,func : func});return token;};return q;//取消订阅就不写了,遍历topics,然后通过保存前面返回token,删除指定元素})();//触发的事件var f2 = function(topics, data) {console.log("logging:" + topics + ":" + data);console.log("this is function2");}function f1(){ setTimeout(function () { // f1的任务代码 console.log("this is function1");//发布消息"done"pubsub .publish("done", "hello world"); }, 1000);}pubsub.subscribe("done", f2);f1();上面代码的运行结果为:this is function1logging:done:hello worldthis is function2观察者模式的实现方法有很多种,也可以直接借用第三方库。这种方法的性质与"事件监听"类似(观察者模式和自定义事件非常相似),但是明显优于后者。观察者模式和事件监听一样具有良好的去耦性,并且有一个消息中心,通过对消息中心的处理,可以良好地监控程序运行。
function f1(){var def = $.Deferred();setTimeout(function () {// f1的任务代码console.log("this is f1");def.resolve(); }, 500);return def.promise();}function f2(){console.log("this is f2");}f1().then(f2);上面代码的运行结果为:this is f1this is f2上面引用的是jquery对Promises/A的实现,jquery中还有一系列方法,具体可参考:Deferred Object.关于Promises,强烈建议读一下You"re Missing the Point of Promises.还有很多第三方库实现了Promises,如:Q、Bluebird、 mmDeferred 等。Promise(中文:承诺)其实为一个有限状态机,共有三种状态:pending(执行中)、fulfilled(执行成功)和rejected(执行失败)。其中pending为初始状态,fulfilled和rejected为结束状态(结束状态表示promise的生命周期已结束)。状态转换关系为:pending->fulfilled,pending->rejected。随着状态的转换将触发各种事件(如执行成功事件、执行失败事件等)。 下节具体讲述状态机实现js异步编程。

var f1 = new Promise(function(resolve, reject) {setTimeout(function () {// f1的任务代码console.log("this is f1");resolve("Success");}, 500); });function f2(val){console.log(val + ":" + "this is f2");}function f3(){console.log("this is f3")}f1.then(f2);f3();以上代码在Chrome 版本43中的运行结果为:this is f3this is f1Success:this is f2以上就是针对javascript异步编程的了解学习,之后还有相关文章进行分享,不要错过哦。