【发布时间】:2010-05-11 16:22:13
【问题描述】:
JavaScript 何时评估函数?是在页面加载时还是在调用函数时?
之所以这么问是因为我有如下代码:
function scriptLoaded() {
// one of our scripts finished loading, detect which scripts are available:
var jQuery = window.jQuery;
var maps = window.google && google.maps;
if (maps && !requiresGmaps.called) {
requiresGmaps.called = true;
requiresGmaps();
}
if (jQuery && !requiresJQuery.called) {
requiresJQuery.called = true;
requiresJQuery();
}
if (maps && jQuery && !requiresBothJQueryGmaps.called) {
requiresBothJQueryGmaps.called = true;
requiresBothJQueryGmaps();
}
}
// asynch download of script
function addScript(url) {
var script = document.createElement('script');
script.src = url;
// older IE...
script.onreadystatechange=function () {
if (this.readyState == 'complete') scriptLoaded.call(this);
}
script.onload=scriptLoaded;
document.getElementsByTagName('head')[0].appendChild(script);
}
addScript('http://google.com/gmaps.js');
addScript('http://jquery.com/jquery.js');
// define some function dependecies
function requiresJQuery() { // create JQuery objects }
function requiresGmaps() { // create Google Maps object, etc }
function requiresBothJQueryGmaps() { ... }
我想要做的是异步下载我的 JavaScript 并尽早开始执行这些脚本,但我的代码依赖于脚本何时被明显下载和加载。
当我尝试上面的代码时,我的浏览器似乎仍在尝试评估我的 require* 函数中的代码,甚至在这些函数被调用之前。它是否正确?还是我误解了我的代码有什么问题?
【问题讨论】:
-
这个问题只有在你足够聪明地将你的 JavaScript 从你的标记中放入一个外部文件时才有意义。如果你缺乏这样的智慧,那么你应该期待不确定性和混乱。
标签: javascript jquery google-maps asynchronous