JavaScript包含的作用域是如何工作的?

JavaScript包含的作用域是如何工作的?,javascript,Javascript,例如,假设我的HTML中有以下内容 <script src="/socket.io/socket.io.js"></script> 该脚本定义了一个名为socket的变量。下面我有以下内容 <script src="/javascripts/script.js" type="text/javascript"></script> 在script.js中,我尝试访问套接字并得到一个未定义的错误。但是,如果我使用内联脚本,我可以访问变量。如何

例如,假设我的HTML中有以下内容

<script src="/socket.io/socket.io.js"></script>

该脚本定义了一个名为socket的变量。下面我有以下内容

<script src="/javascripts/script.js" type="text/javascript"></script>


在script.js中,我尝试访问套接字并得到一个未定义的错误。但是,如果我使用内联脚本,我可以访问变量。如何从script.js中访问“socket”?

您在哪里定义这些脚本?他们在头牌上吗?如果是这样,您应该能够访问脚本之间的变量…

JavaScript本身没有“包含”

在JS文件的顶层声明的任何变量将在加载文件后立即在全局范围内可用,即在使用
标记时

请注意,在
标记上加载了
defer
属性的脚本可能不会立即加载,因此其中声明的任何变量都不会立即可用

在回调函数中使用
var
关键字声明的变量不会出现在全局范围中。所以在这段代码中:

var a = 1;
$(document).ready(function() {
    var b = 1;
});
$(document).ready(function() {
    c = 1;
});
a
将在全局范围内,但
b
将不在全局范围内

鉴于在本规范中:

var a = 1;
$(document).ready(function() {
    var b = 1;
});
$(document).ready(function() {
    c = 1;
});

c
将在全局范围内(因为它不是用
var
关键字声明的),但直到调用回调函数为止。

当套接字脚本尚未加载时,您正试图访问变量。使用
$(document).ready()
或其他什么。socket.io.js的代码是什么?如果这是socket.io,它会导出一个名为
io
的变量,但不会导出一个名为socket的变量。