6

如果我在脚本标记之后立即声明一个全局变量,那么在文档准备好的函数中访问这个变量是否安全?

<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

4 回答 4

8

在文档就绪中调用的函数中访问此变量是否安全

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

由于脚本执行是同步的(浏览器将停止渲染,直到完成解析和执行脚本元素),所以在执行完成之前不会触发 DOM 就绪事件。


编辑 (问题已更新)

那如果我这样做...

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

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

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

bar = "foo";

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

于 2013-08-06T14:07:38.850 回答
0

使用全局变量是safe.

但是在 Jquery 中使用全局变量时必须小心

使用Window.bar="foo"而不是var bar="foo"获取更多信息 在 Jquery 中使用全局变量的最佳方法

我用过全局变量,真的很有用..

于 2013-08-06T14:12:36.060 回答
0

由于bar在全局范围内声明,我希望它在调用callBar.

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

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

于 2013-08-06T14:08:52.030 回答
0

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

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

于 2013-08-06T14:10:14.177 回答