JavaScript函数执行可以被中断吗?

有一个对象来存储数据。

var store = { elements: [], eventsEnabled: true, addElement: function(element) { this.elements.push(element); if (this.eventsEnabled) { // Code that triggers event, calls handlers... whatever } } }; 

存储数据的行为来自两个事件(两种生产者)。 第一个“生产者”不会触发任何事件:

 setInterval(function() { store.eventsEnabled = false; store.addElement('hello'); store.eventsEnabled = true; }, 12000); 

秒确实触发事件:

 setInterval(function() { store.addElement('bye'); }, 7000); 

问题是,第二个生产者可以打破第一个生产者的执行流程吗?

我的意思是,如果生产者1禁用事件,并且在完成执行之前(因此在再次启用事件之前),生产者2开始执行并添加其元素,则不会触发任何事件。 那可能吗? 这会发生吗?

如果是这样,如何将此代码转换为线程安全的?

JavaScript是单线程的。 函数不能被中断,因此您可以确保每个function块在另一个function块开始之前完成。

(但是,如果一个函数进行异步调用,其他函数可能会在异步操作开始之前执行。但是在代码中不会发生这种情况,除了setTimeout调用之外,我可以看到,你可以确定它们会执行按正确的顺序。)

eventsEnabled作为参数传递给addElement方法会不会更明智?

 var store = { elements: [], addElement: function(element,eventsEnabled) { this.elements.push(element); if (eventsEnabled) { // Code that triggers event, calls handlers... whatever } } }; 

第一:

 setInterval(function() { store.addElement('hello',false); }, 12000); 

第二:

 setInterval(function() { store.addElement('bye',true); }, 12000); 

继@ Jamiec的建议之后,您还可以查看传递事件函数:

 var store = { elements: [], addElement: function(element, callback) { this.elements.push(element); if (callback !== undefined) { callback(); // Common code that triggers event, calls handlers... whatever alert("I'm Common Event Code"); } } };​ 

用作这样的:

 setInterval(function() { store.addElement('hello', function(){ alert("I'm Special Event Code!"); }); }, 12000); 

因此,如果需要一个事件,你可以传入它,否则就把它留下来。