不使用全局变量从其他函数访问变量

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

如果最初生成的数字是一个局部变量,则不能从这里访问它。如果这些函数是对象方法,我可以把这个数字作为一个属性,但是它们不是,要改变整个程序结构来实现这一点似乎有点过于复杂。全局变量真的那么糟糕吗?

294528 次浏览

如果另一个函数需要使用一个变量,你可以将它作为参数传递给该函数。

此外,全球变量本质上并不肮脏和邪恶。只要使用得当,它们就没有问题。

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

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

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

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


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

如果您有机会重用这段代码,那么我可能会努力采用面向对象的视角。使用全局名称空间可能是危险的——由于变量名被重用,您可能很难找到 bug。通常,我首先使用面向对象的方法来处理任何事情,而不是简单的回调,这样我就不必重写了。任何时候,只要在 javascript 中有一组相关的函数,我认为,它就是面向对象方法的候选者。

你要找的东西严格来说叫做咖喱。

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));

上面的函数并不是真正的 curry 函数,但是它实现了在不向全局名称空间添加变量或需要其他对象存储库的情况下维护现有值的结果。

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

全局变量被认为是不好的,因为全局变量状态和多个修饰符会造成难以跟踪的代码和奇怪的错误。对许多演员来说,摆弄一些东西会造成混乱。

我认为最好的办法是定义一个 单身全局范围的变量,然后在那里转储变量:

var MyApp = {}; // Globally scoped object


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


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

没有人应该因为你做了上述的事情而对你大喊大叫。

考虑使用名称空间:

(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
};
})();

returned 属性现在可以通过名称空间对象(例如 ns.foo)访问,同时仍然保留对本地定义的访问。

你可以使用定制的 jQuery 事件来完全控制 javascript 函数的执行(并在它们之间传递变量) ... ... 我被告知在这些论坛上这是不可能的,但是我得到了一些可以做到这一点的东西(甚至使用 ajax 调用)。

答案是这样的(重要的是: 这不是检查过的答案,而是我的答案“埃米尔”) :

如何让一个变量跨多个函数返回-Javascript/jQuery

另一种方法是我从一个道格拉斯·克罗克福特论坛帖子(http://bytes.com/topic/javascript/answers/512361-array-objects)中挑选出来的。

道格拉斯·克罗克福特写道:

2006年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

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

我发现这对于最初的问题非常有帮助:

返回您希望在 function One 中使用的值,然后在 function Two 中调用 function One,然后将结果放入一个新的 var 中,并在 function Two 中引用这个新的 var。这应该允许您使用 function One 中声明的 var,在 function Two 中。

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();