Javascript forEach循环操作和执行顺序
这可能是一个初学者的问题,但我担心全局对象将如何更新。我会展示我在做什么,然后谈谈我的担忧Javascript forEach循环操作和执行顺序,javascript,performance,function,foreach,Javascript,Performance,Function,Foreach,这可能是一个初学者的问题,但我担心全局对象将如何更新。我会展示我在做什么,然后谈谈我的担忧 (function() { var obj = {}; var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { //do whatever with the mutation //updat
(function() {
var obj = {};
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
//do whatever with the mutation
//update the obj variable
});
});
observer.observe(target, config);
})();
我担心的是,当突变会很快地连续出现时,我能保证第一批突变会在进入下一批之前完成它们的过程吗?我想我理解闭包是如何工作的,但我不认为这是我需要的。我在考虑将每一批变异传递给一个函数,也许创建一个队列,并以这种方式进行处理……这是一种更好的方式来确保所有事情都能按顺序进行处理吗?当每一个变异过程都将完成时,还要创建某种回调,然后继续下一个?或者,forEach
循环为我处理这个问题吗
另外,在处理这些突变时,我认为我正在阻塞线程,因为所有事情都是同步完成的,对吗?我应该在每个变异周围使用IIFE并使用setTimeout()
使其异步吗
(function() {
var obj = {};
function processMutation(mutation) {
//do whatever with the mutation
//update the obj variable
}
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
//this really isn't IIFE since forEach already is an IIFE?
setTimeout(function() {
//pass it to a separate function and release the forEach function
processMutation(mutation);
}, 0);
//this ^ should make it async?
});
});
observer.observe(target, config);
})();
这样做,每个变异是否会添加到processMutation
函数内的堆栈中,使变异的处理异步,并允许主线程继续侦听其他变异?因为某些处理可能需要很长时间才能完成
希望这个问题不要太笼统……我想得到一些建议。突变事件已经是异步的。进一步推迟是没有意义的
setTimeout
不能使您的处理并行。@Bergi所以我担心突变会很快出现……它们都会按照它们出现的顺序执行吗?更新是否正常?是的,会的。事件循环保证每个事件的(同步)处理将在开始下一个事件之前完成。@Bergi man…所有这些写作和思考都是徒劳的:)谢谢你让我放心!每个变异都将调用回调函数(MutationObserver构造函数的参数),回调函数可以访问该特定变异的MutationRecords
数组。当目标上发生一系列变化时,会为每个函数调用回调,因为JavaScript是单线程的,所以每个被调用的函数都会逐个执行