我从很多地方听说全局变量本质上是讨厌和邪恶的,但是在做一些非面向对象的 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();