3

所以这是我第一次在更强大的环境中使用 Javascript,拥有一个胖客户端并通过 javascript 本身完成大部分繁重的工作。我正在使用 jQuery,现在很多代码都变得很混乱,因为它只是一堆函数。

结果对于我的一些函数,我需要通过多个函数传递变量,并保持它们的值。这样做的明显方法是将它们声明在函数范围之外,然后让函数以它应该的方式对其进行操作。(这些变量是对象而不是原始类型,所以我猜 javascript 是通过引用传递的,这是可行的)。

例如,我可能有这样的东西

var node = //init with some value;

$(document).ready(setup);
function setup()
{
 A();
 B();
}

function A()
{
  // operate on var node
}

function B()
{
  // operate on var node
}

这显然是我的代码的缩小版本,但捕获了我处理全局变量的方式。我的问题是,有没有更优雅的方式来完成上述操作?

谢谢

4

6 回答 6

4

你不能这样做的任何理由:

$(document).ready(function() {
    var node = //init with some value;
    setup(node);

    function setup(node) {
        A(node);
        B(node);
    }

    function A(node) {
      // operate on var node
    }

    function B(node) {
      // operate on var node
    }
});

一般来说,使用全局变量和函数是一个坏主意,应尽可能避免。

于 2012-12-18T18:58:19.217 回答
4

请注意,虽然您似乎一直在专门询问有关node、 您的函数setupA并且B也是您版本的所有全局变量。

最简单的方法是将所有这些声明放在一个匿名函数中:

$(document).ready(function() {

    var node = ...;

    function A() {
        ...
    }

    function B() {
        ...
    }

    function setup() {
        A();
        B();
    }

    setup();
});
于 2012-12-18T19:00:42.940 回答
2

只使用一个全局变量(或尽可能少)。使任何函数或对象成为您的一个全局变量的成员。

道格拉斯·克罗克福德 说

一个 JavaScript 程序质量的客观衡量标准是它有多少全局变量和全局函数?大量是不好的,因为与其他程序进行不良交互的机会增加了。理想情况下,应用程序、库、组件或小部件只定义一个全局变量。该变量应该是一个对象,它包含并且是您所有东西的根命名空间。

雅虎的单一全球是YAHOO。它全部大写以将其标识为特殊的东西,因为所有小写都是普通的,并且首字母大写表示构造函数。全部大写,不太可能有人意外使用它,这进一步降低了碰撞的可能性。

http://www.yuiblog.com/blog/2006/06/01/global-domination/

此外,您可以创建对象来进一步组织您的代码。

GLOBAL.myObject = {}; GLOBAL.myObject.myFunction = ...

于 2012-12-18T19:00:41.013 回答
2

我更喜欢“展示模块”模式

var myApp = (function () {
    // privates
    var node;

    var a = function () {
        // operate on node
    };

    var b = function () {
        // operate on node
    };

    // publics
    var init = function () {
        // initialization stuff
        a();
        b();
    };

    return {
        init: init
    };
})();

$(document).ready(function () {
    myApp.init();
});

这样一来,您就只有一个全局 , myApp,它存储您的应用程序需要的所有其他内容。

于 2012-12-18T19:02:15.590 回答
1

我认为这使代码更难理解,我宁愿将变量作为参数并将其作为返回值。

$(function(){
    var outcome = multiply(add(5));
});

function add(num)
{
    return num+1;
}

function multiply(num)
{
    return num*5;
}

如果你觉得你绝对想让全局变量将你的东西包装在一个闭包中,这样它实际上就不会进入全局范围。

IE,

(function(){
    var a; // can be used in any functions within this closure, but not polluting window
    function A()
    {
        a = 'blah';
    }
})();
于 2012-12-18T18:59:50.590 回答
0

有许多。例如,对象。

// jQuery shorthand for "wait till DOM ready"
$( function() {
   // create node object
   var node = {
      id: /* some value */,
      setup: function() {
         this.A();
         this.B();
      },
      A: function() {
         // operate on this.id
      },
      B: function() {
         // operate on this.id
      }
   };
   // setup node object
   node.setup();
} );

全局变量是等待发生的麻烦。不要弄脏你的全局命名空间。Javascript是一种面向对象的语言,使用对象。请注意,您的对象可以有一个属性,您可以this在对象方法中使用关键字引用该属性。

于 2012-12-18T19:03:13.903 回答