由于JavaScript的事件轮询机制,所有同步代码执行完成之后,才可以执行
不成立的情况下:
function add(x,y){
console.log(1);
setTimeout(function(){
console.log(2);
var ret = x + y;
return ret;
},1000);
console.log(3);
//到这里执行就结束了,不会i等到前面的定时器,所以直接返回了默认值 undefined
}
console.log(add(2,2));
// 结果是 1 3 undefined 4
因此需要通过回调的方法,保证执行顺序
执行顺序
回调函数:通过一个函数,获取函数内部的操作。(根据输入得到输出结果)
var ret;
function add(x,y,callback){
// callback就是回调函数
// var x = 10;
// var y = 20;
// var callback = function(ret){console.log(ret);}
console.log(1);
setTimeout(function(){
var ret = x + y;
callback(ret);
},1000);
console.log(3);
}
add(10,20,function(ret){
console.log(ret);
});
执行顺序是如此
- 调用add(10,20,方法)里面,因为当前方法是个参数,进入add函数。
- 函数进入后,因为当前作用域没有ret,向上找到
var ret=x+y
- re.因为作用域链t进入下面的function(ret),因此最后输出了30
涉及到了闭包和原型的问题,闭包解决了回调,后面有时间可以看看前面的文章