从其他函数访问variables而不使用全局variables

我从各种地方听说,全局variables本质上是恶劣的,但是当做一些非面向对象的Javascript时,我看不到如何避免它们。 说我有一个函数,使用一个复杂的algorithm,使用随机数和东西,生成一个数字,但我需要继续使用这个特定的数字在一些其他函数,这是一个callback或什么,所以不能是同一个function的一部分。

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

要使函数A中计算的variables在函数B中可见,您有三个select:

  • 使其成为全球性的,
  • 使其成为对象属性,或者
  • 从A调用B时将它作为parameter passing

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

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

我认为这里最好的select可能是定义一个单一的全局范围的variables,并在那里倾销你的variables:

 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都可以访问所有本地和全局variables。

编辑 :另一种常见模式:

 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 ed属性现在可以通过命名空间对象访问,例如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)); 

上面的代码并不完全是一个curried函数,但是它实现了维护一个现有值的结果,而不需要在全局名称空间中添加variables,也不需要其他对象存储库。

如果另一个函数需要使用variables,则将其作为parameter passing给该函数。

全球variables也不是固有的恶劣和邪恶。 只要使用得当,就没有问题了。

另一种方法是我从道格拉斯·克罗克福德(Douglas Crockford)论坛发帖( http://bytes.com/topic/javascript/answers/512361-array-objects )中find的。 这里是…

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

Jul 15 '06

“如果你想通过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 

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

如果您有机会重复使用这些代码,那么我可能会努力使用面向对象的观点。 使用全局命名空间可能是危险的 – 由于variables名被重用,您很难findbug。 通常,我首先使用面向对象的方法,而不是简单的callback,这样我就不必重写了。 任何时候你在javascript中都有一组相关的函数,我认为它是面向对象方法的候选者。

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

全局variables被认为是不好的,因为全局状态和多个修改器可能难以跟踪代码和奇怪的错误。 许多演员摆弄东西可能会造成混乱。

你可以完全控制JavaScript函数的执行(并在它们之间传递variables)使用自定义jQuery事件….我被告知,这是不可能的所有这些论坛,但我得到了一些工作,就是这样做(甚至使用一个ajax调用)。

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

如何获取跨多个函数返回的variables – Javascript / jQuery

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

返回你想在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();