你不知道的Javascript中卷(笔记一)

92 阅读2分钟

记忆力持续性阻塞,写个笔记唤起阻塞线程,欢迎批评指正

Es6的任务队列,指的是挂在事件循环队列的每个tick 之后的一个队列,在事件循环队列中,可能出现的异步动作不会导致一个完整的新事件添加到时间循环队列中,而会在当前tick的任务队列末尾添加一个任务

回调函数分嵌套回调和链式回调。

回调表达异步流程的方式是非线性的、非顺序的;

js 的回调地狱会造成代码非常复杂、不便于维护和更新

设计一个分离回调的方式来避免回调地狱(一个用于成功通知的函数,一个用户失败通知的函数):

function success(data){   
    console.log(data)
}

function failure(err){   
    console.log(err)
}

ajax("http://some.url.1", success,failure)

也可使用Node风格来解决回调地狱,意思是,回调的第一个参数保留用作错误的对象(如果有的话),如果成功的话,这个参数就会清空/置假,如果产生了错误,那么第一个参数就会被置起/置真。

function response(err,data){	
    if(err){		
        console.log(err)	
    } else{		
        console.log((data))	
    }
}
ajax("http://some.url.1", response)

回调函数在执行过程的中的顺序会产生信任问题。可以构造一个工具来解决信任问题:

function timoutify(fn,delay){	var intv = setTimeout(function(){			intv = null;			fn(new Error("Timeout"))	},delay)	return function(){			if(intv){				// 还没超时:				clearTimeout(intv);				fn.apply(this,arguments)			}	}	}	//使用方式:function foo(err,data){	if(err){		console.log(err)	}else{		console.log((data))	}}ajax("htttp://some.url.1",timoutify(foo,500))

针对不信任的输入的防御性的代码:

function addNUmbers(x,y){	
    if(typeof x != "number" || typeof y !="number"){		
        throw Error("Bad parameters")	
    }	
    return x+y
}

依旧安全但更友好一些的(原则是信任,但要核实):

function addNumberrs(x,y){	
    x = Number(x)	
    y = Number(y)	
    return x + y
}