JavaScript变量的范围(与XUL相关)

时间:2012-04-10 21:09:25

标签: javascript xul

一个初学者的问题,可能是一个微不足道的问题。这是XUL代码片段:

<window
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script type="application/javascript" src="chrome://.../main.js"/>

    <button label="Click me!" oncommand="clickhandler()"/>
</window>

JavaScript代码:

// main.js

var test = "Peanut butter";    // a global variable

function clickhandler() {
    alert(test);
}

解释器在读取主窗口的开始标记后立即处理JavaScript文件,然后继续处理其余的XUL代码。在我看来,在解释器完成处理test的那一刻,main.js变量应该超出范围。此外,clickhandler()函数也应该超出范围,这意味着,当单击按钮时,不会发生任何事情。好吧,除非我将它们声明为document.testdocument.clickhandler()。然而,一个简单的实验证明我错了。单击按钮时,函数和变量都存在。这样声明的变量的实际寿命是多少?什么时候被摧毁?它们一直存在,直到应用程序退出?任何最佳实践和参考资料都受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

您希望它的行为类似于您习惯使用块范围的语言。我建议阅读Douglas Crockford的书“The Good Parts”,以便更好地理解为什么一切都按照它的方式运作。如果你从一开始就学会了所有这些,那么你将会有更轻松的时间。

Javascript在功能范围内..在此示例中,测试范围在foo中。

var foo = function() {
    var test = "Peanut Butter";
};

在此示例中,您可以看到该函数可以修改test,因为它是一个全局范围的变量。

var test = "peanut butter";
var foo = function() {
    test = "Apple sauce";
};

有三种方法可以定义全局范围的变量,我建议你避免这些变量(不完全是,这是不可能的)。全局变量是必要的,但可以减轻它们。只要加载了javascript,它们的生命周期就可以了。如果在同一页面加载的不同.js文件中定义多个全局变量,则两者都可以访问这些全局变量,从而很容易意外地从不同文件中覆盖变量。

1:将var语句放在任何函数之外,就像你已经完成的那样。

2:将其作为属性添加到全局对象。

window.foo = value;

3。使用变量而不声明它,这是一个隐含的全局。真的要注意这些。您声明的函数实际上是一个隐含的全局,称为“clickhandler”。

foo = value;

最小化全局变量使用的常见做法称为全局变更,在其中定义一个特定于应用程序的全局变量来保存其余的全局变量,以避免与其他库冲突。这是通过声明一个对象文字并使用第二种创建全局变量的方法来完成的。但是,只有在需要全局变量时才使用它,并尽可能坚持功能范围。

var AWESOMENEWAPP = {};
AWESOMENEWAPP.test = "Peanut Butter";

当你深入了解javascript的世界时,你将开始学习有用的东西,比如闭包等,以保持你的代码干净整洁。

只是不要指望javascript像典型的古典语言一样工作,你会发现它本身就是一种强大的语言,只是不同。

在您的旅程中,我建议您使用工具JSLint来测试您的代码,以了解您未看到的以下约定和错误,因为它未编译。

答案 1 :(得分:1)

是的,全局函数和变量存在,直到用户离开应用程序或关闭该选项卡,如果您使用的是浏览器。这就是为什么最好的做法是尽可能使用变量或函数来填充全局范围。