繁体   English   中英

在不使用全局变量的情况下从其他函数访问变量

[英]Accessing variables from other functions without using global variables

我从各种各样的地方听说全局变量本质上是讨厌和邪恶的,但是当做一些非面向对象的Javascript时,我看不出如何避免它们。 假设我有一个使用随机数和东西使用复杂算法生成数字的函数,但我需要在其他函数中继续使用该特定数字,这是一个回调或其他函数,因此不能成为同一函数的一部分。

如果最初生成的数字是局部变量,那么就无法访问它。 如果函数是对象方法,我可以将数字作为属性,但它们不是,并且看起来有点过于复杂,以改变整个程序结构来执行此操作。 全局变量真的如此糟糕吗?

我觉得这里最好的办法可能是定义一个全局范围的变量,并且有倾倒的变量:

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

做上述事情的人不应该对你大喊大叫。

要使函数A中计算的变量在函数B中可见,您有三个选择:

  • 使它成为一个全球的,
  • 使它成为一个对象属性,或
  • 从A调用B时将其作为参数传递

如果你的程序相当小,那么全局变量就不那么糟了。 否则我会考虑使用第三种方法:

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}

考虑使用命名空间:

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

local_functionglobal_function都可以访问所有本地和全局变量。

编辑 :另一种常见模式:

var ns = (function() {
    // local stuff
    function foo() {}
    function bar() {}
    function baz() {} // this one stays invisible

    // stuff visible in namespace object
    return {
        foo : foo,
        bar : bar
    };
})();

现在可以通过命名空间对象(例如ns.foo访问return ed属性,同时仍保留对本地定义的访问权限。

您正在寻找的是技术上称为currying。

function getMyCallback(randomValue)
{
    return function(otherParam)
    {
        return randomValue * otherParam //or whatever it is you are doing.
    }

}

var myCallback = getMyCallBack(getRand())

alert(myCallBack(1));
alert(myCallBack(2));

上面的内容并不完全是一个curried函数,但它实现了维护现有值的结果,而无需向全局命名空间添加变量或者需要一些其他对象存储库。

如果另一个函数需要使用变量,则将其作为参数传递给函数。

全球变量本身也不是恶劣的。 只要它们使用得当,它们就没有问题。

另一种方法是我从Douglas Crockford论坛帖子( http://bytes.com/topic/javascript/answers/512361-array-objects )中选择的方法。 这里是...

Douglas Crockford写道:

06年7月15日

“如果你想通过id检索对象,那么你应该使用一个对象,而不是一个数组。由于函数也是对象,你可以将成员存储在函数本身中。”

function objFacility(id, name, adr, city, state, zip) {

    return objFacility[id] = {

        id: id,
        name: name,
        adr: adr,
        city: city,
        state: state,
        zip: zip

    }
}

objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010);

“可以用”获得对象“

objFacility.wlevine

现在可以从任何其他函数中访问对象属性。

我发现这对原始问题非常有帮助:

返回你想在functionOne中使用的值,然后在functionTwo中调用functionOne,然后将结果放入一个新的var中,并在functionTwo中引用这个新的var。 这应该使您能够在functionTwo中使用functionOne中声明的var。

function functionOne() {
  var variableThree = 3;
  return variableThree;
}

function functionTwo() {
  var variableOne = 1;
  var var3 = functionOne();

  var result = var3 - variableOne;

  console.log(variableOne);
  console.log(var3);
  console.log('functional result: ' + result);
}

functionTwo();

如果您有可能重用此代码,那么我可能会努力使用面向对象的视角。 使用全局命名空间可能很危险 - 由于变量名称被重用,您将面临很难发现错误的风险。 通常我首先使用面向对象的方法,而不仅仅是简单的回调,这样我就不必重写了。 任何时候你在javascript中有一组相关的函数,我认为,它是面向对象方法的候选者。

你可以使用自定义的jQuery事件完全控制javascript函数的执行(并在它们之间传递变量)....有人告诉我这不可能在这些论坛上,但我有一些工作正是这样做(甚至使用ajax电话)。

这是答案(重要提示:这不是经过检查的答案,而是我的回答“Emile”):

如何获取跨多个函数返回的变量 - Javascript / jQuery

我不知道你的问题的具体细节,但如果函数需要值,那么它可以是通过调用传递的参数。

Globals被认为是错误的,因为全局状态和多个修饰符可能会导致难以遵循的代码和奇怪的错误。 对许多摆弄东西的演员来说,可能会造成混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM