【问题标题】:JavaScript: global scopeJavaScript:全局范围
【发布时间】:2011-03-17 00:01:45
【问题描述】:

现在,我创建了一个包含很多功能的 .js 文件,然后将其链接到我的 html 页面。这行得通,但我想知道在我的页面中插入 js 并避免与范围冲突的最佳方式(良好做法)是什么...... 谢谢。

【问题讨论】:

标签: javascript scope global


【解决方案1】:

您可以将它们包装在一个匿名函数中,例如:

(function(){ /* */ })();

但是,如果您需要重新使用您在其他地方(在其他脚本中)编写的所有 javascript 函数,您最好创建一个可以访问它们的全局对象。要么喜欢:

var mySingleGlobalObject={};
mySingleGlobalObject.someVariable='a string value';
mySingleGlobalObject.someMethod=function(par1, par2){ /* */ };

或替代的、更短的语法(做同样的事情):

var mySingleGlobalObject={
  someVariable:'a string value',
  someMethod:function(par1, par2){ /* */ }
};

这可以稍后从其他脚本访问,例如:

mySingleGlobalObject.someMethod('jack', 'jill');

【讨论】:

  • 我认为总是用 (function(){ /* */ })(); 包装你的代码更安全。以防万一您包含一个严重终止的脚本。然后,我想你可以将你的 mySingleGlobalObject 添加到“文档”,例如,与其他脚本共享。
【解决方案2】:

一个简单的想法是使用一个代表您的命名空间的对象:

var NameSpace = {
    Person : function(name, age) {

    }
};

var jim= new NameSpace.Person("Jim", 30);

【讨论】:

    【解决方案3】:

    最好的方法是创建一个新的作用域并在那里执行你的代码。

    (function(){
      //code here
    })();
    

    这最好在至少访问全局范围时使用。

    基本上,这定义了一个匿名函数,给它一个新的范围,然后调用它。

    【讨论】:

    • “()”是什么意思?关于那个的任何链接?那么window.onload呢?我应该把它放在哪里? JavaScript 中是否有类似引导程序的做法?谢谢。
    • 我个人认为,如果您在一行中看到所有匿名函数,则更容易理解它。不幸的是,我在 cmets 中没有换行符,但如果你这样想:这就像执行一个已经存在的函数,但不是使用函数的名称,而是将函数定义放在括号中。
    • 您实际上可以这样做,例如: (function(param){ /* */ })( 'param value' );
    • @thomas:发现这个站点的描述很好:helephant.com/2008/08/javascript-anonymous-functions“为变量提供范围”。你想把window.onload放在哪里?
    【解决方案4】:

    这可能不是最好的方法,但是很多 PHP 系统(我在看你,Drupal)采用他们特定插件的名称并将其添加到所有函数名称之前。您可以做类似的事情,将您的能力名称添加到您的函数名称中 - “mything_do_action()”

    或者,您可以采用更“OO”的方法,创建一个封装您的功能的对象,并将您的所有函数添加为 IT 上的成员函数。这样一来,全球范围内只需担心一件事。

    【讨论】:

    • 我正在尝试使用 JavaScript 学习 OO,但这对我来说很难。有很多语法可以在 JavaScript 中创建一个简单的“类”或其他任何东西 :) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2015-09-30
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多