Javascript 脚本块的Js执行机制
我正在学习使用闭包库,谷歌提醒我们要小心使用闭包库: 这不起作用:Javascript 脚本块的Js执行机制,javascript,Javascript,我正在学习使用闭包库,谷歌提醒我们要小心使用闭包库: 这不起作用: <script src="closure-library/closure/goog/base.js"></script> <script> // DON'T DO THIS. goog.require('goog.dom'); var newHeader = goog.dom.createDom('h1'); </script> goog.dom将在goog.requ
<script src="closure-library/closure/goog/base.js"></script>
<script>
// DON'T DO THIS.
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
goog.dom
将在goog.require
之后立即调用,但是为什么它不会抛出错误呢
这似乎是因为两段代码位于两个script
块中
因此,我想知道是否有人能解释JavaScript在不同脚本块和不同位置(头部或身体内部)的执行机制
Romain的answser更新:
解析器可以看到:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
虽然
是在var newHeader=goog.dom.createDom….
之前添加的,dom.js
将被下载,但是goog.dom.create….
是否会在dom.js
完全下载并执行之后执行?但我听说js执行是异步的。我错过了什么吗?从“入门”页面:
require()调用为goog.dom.createDom()添加代码
紧靠包含行var newHeader的脚本标记之前=
goog.dom.createDom('h1')
脚本加载器通过将脚本元素插入DOM来加载脚本。它在“当前脚本元素”之后插入它们。这就是为什么在使用动态加载脚本的函数之前需要“关闭”脚本元素的原因
如果这是您的源html:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
解析器可以看到:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
但如果你的来源是:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
解析器可以看到:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
这当然行不通
脚本执行是同步的。下载带有脚本元素的脚本会阻止脚本的执行(以及页面的呈现)。这就是为什么不应该将不必要的脚本元素放入
中的原因。这会阻止解析器,因此会阻止后面的所有内容(也称为文档)的呈现,直到脚本被下载为止
在HTML5中,有一个属性声明浏览器不应等待脚本下载。但是默认行为是等待。从“入门”页面:
require()调用为goog.dom.createDom()添加代码
紧靠包含行var newHeader的脚本标记之前=
goog.dom.createDom('h1')
脚本加载器通过将脚本元素插入DOM来加载脚本。它在“当前脚本元素”之后插入它们。这就是为什么在使用动态加载脚本的函数之前需要“关闭”脚本元素的原因
如果这是您的源html:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
解析器可以看到:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
但如果你的来源是:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
解析器可以看到:
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
<script>
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/base.js"></script>
<script>
goog.require('goog.dom');
var newHeader = goog.dom.createDom('h1');
</script>
<script src="closure-library/closure/goog/dom.js"></script>
goog.require('goog.dom');
var newHeader=goog.dom.createDom('h1');
这当然行不通
脚本执行是同步的。下载带有脚本元素的脚本会阻止脚本的执行(以及页面的呈现)。这就是为什么不应该将不必要的脚本元素放入
中的原因。这会阻止解析器,因此会阻止后面的所有内容(也称为文档)的呈现,直到脚本被下载为止
在HTML5中,有一个属性声明浏览器不应等待脚本下载。但是默认行为是等待。那么
中的脚本元素会阻止脚本的执行吗?
中的脚本如何?不,这只是一个示例。在所有情况下(也在
中),浏览器都会等待脚本下载并执行后再继续。不同之处在于,如果将脚本放入
中,浏览器必须等待,然后才能开始绘制
的内容。如果将脚本标记放在body标记的末尾,则“nothing”必须等待。因此,页面似乎会在
中加载fasterSo脚本元素,这会阻止脚本的执行吗?
中的脚本如何?不,这只是一个示例。在所有情况下(也在
中),浏览器都会等待脚本下载并执行后再继续。不同之处在于,如果将脚本放入
中,浏览器必须等待,然后才能开始绘制
的内容。而如果将脚本标记放在body标记的末尾,“nothing”必须等待,因此页面加载速度似乎会更快