【问题标题】:How does <script src...> let other files access the libraries they import?<script src...> 如何让其他文件访问它们导入的库?
【发布时间】:2014-02-28 20:46:28
【问题描述】:

在我的 html 文件中,我正在这样做:

<script src="http://[node server]:3000/socket.io/socket.io.js"></script> 
<script type="text/javascript" src="file.js"></script>

在我的file.js 中,我现在可以使用socket.io 功能。

socket.io 的内容如何对file.js 可见?

【问题讨论】:

  • src 只是指向一个外部 JavaScript 文件,在这种情况下来自节点服务器和 file.js,我在这里遗漏了什么吗?
  • 您的浏览器正在将所有这些函数编译到 DOM 中,所有这些库都将可用,因为它实际上包含在您的 HTTP 请求中。
  • 顺序很重要——因为socket.io是在之前添加了file.js,使用file.js时已经加载了——W3C reference.
  • socket.io.js 文件,保证 file.js 之前运行(没有异步标志,脚本按文档顺序执行) ,在全局范围(window 对象)上执行 副作用 - 在这种情况下,添加了可以使用的 socket.io“命名空间”。一个页面中的所有脚本共享同一个全局window 对象。

标签: javascript html node.js src


【解决方案1】:

如果您来自包含严格的语言,那么您的想法会有点奇怪。 Javascript 是在全局范围内,因此只要在“较低”文件中引用它之前包含一个 javascript 文件,您就可以访问第一个 javascript 中的所有内容。

我猜,可以将其视为将所有内容粘贴到一个大文件中...... :)

【讨论】:

    【解决方案2】:

    以这种方式包含的任何脚本都不会在它自己的上下文中运行。相反,所有脚本都在加载它们的窗口的上下文中执行,这意味着在一个脚本中加载的任何对象或方法将在同一窗口中执行的其他脚本中可用。

    这里的顺序也很重要。如果首先包含file.js,则对socket.io 中定义的对象或函数的任何引用都将是未定义的。也就是说,除非您在 file.js 中有某种延迟执行机制,它会一直等到文档的其余部分被加载执行。

    当然,这也适用于内联脚本。例如:

    <!-- defines myFunc -->
    <script type="text/javascript" src="my.js"></script> 
    <script type="text/javascript">
        myFunc(); // call myFunc
    </script> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 2021-06-16
      • 2016-11-27
      • 2019-03-07
      • 2022-10-14
      • 2012-10-07
      • 2021-10-04
      • 2022-01-22
      相关资源
      最近更新 更多