我从很多地方听说全局变量本质上是讨厌和邪恶的,但是在做一些非面向对象的 Javascript 时,我看不出如何避免它们。假设我有一个函数,它使用使用随机数和东西的复杂算法生成一个数字,但我需要在其他一些函数中继续使用该特定数字,该函数是回调或其他函数,因此不能成为同一函数的一部分。
如果最初生成的数字是局部变量,则无法从那里访问它。如果函数是对象方法,我可以使数字成为一个属性,但它们不是,更改整个程序结构来执行此操作似乎有些过于复杂。全局变量真的那么糟糕吗?
我从很多地方听说全局变量本质上是讨厌和邪恶的,但是在做一些非面向对象的 Javascript 时,我看不出如何避免它们。假设我有一个函数,它使用使用随机数和东西的复杂算法生成一个数字,但我需要在其他一些函数中继续使用该特定数字,该函数是回调或其他函数,因此不能成为同一函数的一部分。
如果最初生成的数字是局部变量,则无法从那里访问它。如果函数是对象方法,我可以使数字成为一个属性,但它们不是,更改整个程序结构来执行此操作似乎有些过于复杂。全局变量真的那么糟糕吗?
我想在这里你最好的选择可能是定义一个单一的全球范围的变量,并且有倾倒的变量:
var MyApp = {}; // Globally scoped object
function foo(){
    MyApp.color = 'green';
}
function bar(){
    alert(MyApp.color); // Alerts 'green'
} 
没有人应该因为你做了上面那样的事情而对你大喊大叫。
要使在函数 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_function并global_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
    };
})();
该return编辑性能现在可以通过命名空间对象,如访问ns.foo,同时仍保留访问本地定义。
您要查找的内容在技术上称为柯里化。
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));
以上不完全是一个柯里化函数,但它实现了维护现有值的结果,而无需向全局命名空间添加变量或需要其他一些对象存储库。
我发现这对原始问题非常有帮助:
返回您希望在 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();