在文档准备好之前是否实例化了全局变量?

时间:2013-08-06 14:02:28

标签: javascript jquery

如果我在脚本标记之后声明一个全局变量,那么在文档就绪中调用的函数中访问此变量是否安全?

<script type="text/javascript">
var bar = "foo";

$(document).ready(function(){

callBar()

});

function callBar(){
alert(bar);
// will I crash?
}
</script> 

如果我这样做的话:

<script type="text/javascript">

$(document).ready(function(){

callBar()

});

function callBar(){
alert(bar);
// will I crash?
}

var bar = "foo";
</script> 

4 个答案:

答案 0 :(得分:7)

  

在文档就绪

中调用的函数中访问此变量是否安全

是。作为执行该脚本的非常早期的步骤,将变量声明(added as a binding到执行上下文的变量环境)。 (请注意,在解析期间到达赋值语句之前,它实际上不会被赋值。这通常被称为“提升”,但不会影响您的示例。)

由于脚本执行是同步的(浏览器将在完成解析和执行脚本元素之前停止呈现),因此DOM就绪事件在执行完成之前不会触发。


修改 (问题已更新)

  

如果我这样做的话......

如上所述,变量声明将被提升到它出现的范围的顶部。您的第二个示例有效地解释如下:

// Declarations (both function and variable) are hoisted
var bar;
function callBar() {
    alert(bar);
}

$(document).ready(function () {
    callBar();
});

bar = "foo";

因此,这些声明在整个范围内都可用。 ready事件处理程序将在稍后执行,并且可以访问这些声明(因为它们出现在与它相同的范围内)。

答案 1 :(得分:0)

由于bar在全局范围内声明,我希望在调用callBar之前对其进行初始化。

还要考虑JavaScript具有函数提升功能,如果它们在适当的范围内,则允许引用变量,即使它们稍后在程序中定义(尽管这不是这里的情况)。来自Variable Scope上的MDN文档:

  

JavaScript中变量的另一个不同寻常之处在于,您可以引用稍后声明的变量,而不会出现异常。这个概念被称为吊装; JavaScript中的变量在某种意义上是“被提升”或被提升到函数或语句的顶部。但是,尚未初始化的变量将返回未定义的值。

答案 2 :(得分:0)

是的,甚至在'关闭'标签之前。

'$(document).ready(function(){})'构造中的函数在加载所有页面后触发。

答案 3 :(得分:0)

使用全局变量是safe

但是在Jquery

中使用全局变量时必须小心

使用Window.bar="foo"代替var bar="foo"获取更多信息Best ways to use Global Variables in Jquery

我使用了全局变量,非常有用..