Javascript 这个漏斗形代码是否包含竞争条件?
我正在研究跟踪我遇到的脚本。这是漏斗队的。乍一看,它似乎有一个bug:Javascript 这个漏斗形代码是否包含竞争条件?,javascript,browser,deferred-execution,dynamic-script-loading,Javascript,Browser,Deferred Execution,Dynamic Script Loading,我正在研究跟踪我遇到的脚本。这是漏斗队的。乍一看,它似乎有一个bug: (function(funnel) { var insert = document.getElementsByTagName('script')[0], script = document.createElement('script'); script.addEventListener('load', function() { window.funnelytics.init(f
(function(funnel) {
var insert = document.getElementsByTagName('script')[0],
script = document.createElement('script');
script.addEventListener('load', function() {
window.funnelytics.init(funnel, false);
});
script.src = 'https://cdn.funnelytics.io/track.js';
script.type = 'text/javascript';
script.async = true;
insert.parentNode.insertBefore(script, insert);
})('8889dbc2-6c2f-5ba4-c201-dc8889dbc26c');
在异步脚本
track.js
执行之前,是否有可能调用由load
触发的函数?在这种情况下,行window.funnelytics.init
是否会失败,因为window.funnelytics
尚未定义?此代码不包含竞争条件。请注意,事件侦听器附加到脚本
元素,而不是窗口
对象:
script.AddEventListener('load', function() { // ...
只有在加载并执行脚本后,才会调用此函数
即使事件侦听器已附加到窗口
对象,此代码仍不包含竞争条件。只有在加载并执行所有窗口
的子资源(包括任何动态插入的异步
脚本)后,才会调用该函数,如下所示