Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 脚本块的Js执行机制_Javascript - Fatal编程技术网

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”必须等待,因此页面加载速度似乎会更快