无论出于何种原因,假设我们在页面上有三个内联脚本。这些脚本中的每一个在功能上都是相同的,并且所有三个脚本都将创建一个脚本标记,其中源设置为服务器端脚本(每个脚本具有稍微不同的参数),这些脚本返回JS以执行。假设这个JS包含一个全局变量,该变量包含它最后调用的函数的重要参数。
var g_important = {"arbitrary1":"someval1", "arbitrary2":"someval2"};
doSomething();
有问题的脚本驻留在带有负载均衡器的CDN上。假设我们原始JS的每个请求实际上都可以发送到不同的服务器。服务器的响应时间现在是可变的,这意味着我们可能首先得到对第二个请求的响应。这不是问题,因为我们用代码发回一个参考值,确保我们至少使用指定的对象。
我的问题是:当我们几乎同时得到两个回复时会发生什么?这是一个非常不可能的情况,但如果第一个响应是在第二个响应进入时执行doSomething()的过程中,那么浏览器会做什么?它是否解析变量的值并将第二个doSomething调用推入堆栈?
假设是这种情况,doSomething可以使用错误的值 理论 。我不能重新创造这种情况,因为时机必须绝对完美,但我需要知道它是否是一个问题。
答案 0 :(得分:3)
Javascript一次“运行一行”。如果另一个脚本正在运行,脚本将始终堆叠。
从技术上讲,2个脚本不能同时加载,因此1个将在另一个之前执行。
答案 1 :(得分:0)
这取决于如何注入脚本。技术在确保执行顺序方面取得了成功。常见且简单的document.createElement
+ head.appendChild
方式不会
例如,确保IE中的订单。
答案 2 :(得分:0)
所以你担心g_important
对象在执行doSomething()
期间会发生变化吗?我不认为这是可能的,但是如果你担心它,为什么不在完成每个AJAX请求时注册doSomething()
作为回调。然后,对函数的每次调用都会传递其请求的数据,而不会传递其他数据。
也许我并不完全了解情况,但如果可能的话,这种事情似乎很容易避免。