我从很多地方都听说过,全局变量本来就是讨厌和邪恶的,但是当使用一些非面向对象的Javascript时,我看不到如何避免它们。假设我有一个函数,该函数使用复杂的算法使用随机数和填充物来生成数字,但是我需要在其他函数中继续使用该特定数,该函数是回调函数或其他东西,因此不能成为同一函数的一部分。
如果最初生成的数字是局部变量,则无法从那里访问它。如果函数是对象方法,我可以将数字设为属性,但是它们不是属性,并且更改整个程序结构来执行此操作似乎有些复杂。全局变量真的那么糟糕吗?
我从很多地方都听说过,全局变量本来就是讨厌和邪恶的,但是当使用一些非面向对象的Javascript时,我看不到如何避免它们。假设我有一个函数,该函数使用复杂的算法使用随机数和填充物来生成数字,但是我需要在其他函数中继续使用该特定数,该函数是回调函数或其他东西,因此不能成为同一函数的一部分。
如果最初生成的数字是局部变量,则无法从那里访问它。如果函数是对象方法,我可以将数字设为属性,但是它们不是属性,并且更改整个程序结构来执行此操作似乎有些复杂。全局变量真的那么糟糕吗?
Answers:
要使在函数A中计算出的变量在函数B中可见,您可以选择三种方法:
如果您的程序很小,那么全局变量还不错。否则,我会考虑使用第三种方法:
function A()
{
var rand_num = calculate_random_number();
B(rand_num);
}
function B(r)
{
use_rand_num(r);
}
我认为您最好的选择是定义一个 单一的全球范围的变量,并且有倾倒的变量:
var MyApp = {}; // Globally scoped object
function foo(){
MyApp.color = 'green';
}
function bar(){
alert(MyApp.color); // Alerts 'green'
}
做上述事情的人都不会对你大喊大叫。
MyApp.something.color.somethingElse
var()
应该更改为bar()
,这个微小的语法错误可能会让某些人头痛。
MyApp.color
如果foo()
从未调用过,应该如何创建和填充呢?
考虑使用名称空间:
(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
,同时仍保留访问本地定义。
您要查找的内容在技术上称为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));
上面的函数并不是一个严格的函数,但是它实现了在不向全局名称空间添加变量或不需要其他对象存储库的情况下保持现有值的结果。
myCallback
是getMyCallback
对randomValue
已返回的函数的引用。使用也是getRand
有启发性的,因为我看到myCallBack(1)
多次调用将返回相同的值,因此myCallback
等于从中返回的内容,getMyCallBack(getRand())
而不仅仅是对函数本身的引用。它帮助只是把它大声说:)
我发现这对于原始问题非常有帮助:
返回要在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();
另一种方法是我从Douglas Crockford论坛帖子(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
现在可以从任何其他函数中访问对象属性。
您可以使用自定义jQuery事件完全控制javascript函数的执行(并在它们之间传递变量)..有人告诉我,在所有这些论坛上都不可能做到这一点,但是我确实做了一些工作来做到这一点(即使使用ajax调用)。
这是答案(重要:这不是经过检查的答案,而是我“ Emile”的答案):