从其他函数访问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_function
和global_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();
- 如何允许webpack-dev-server允许来自react-router的入口点
- knockout.js使用$ index和if绑定
- 在android模拟器调用JavaScript与phonegap
- 如何执行整数除法并获得JavaScript中的余数?
- Angular 2 – 如何使用新的angular度2.0.0-rc.1路由器
- 使用jQuery $(this)和ES6箭头函数(lexical this binding)
- 我如何以编程方式从锚标记中调用onclick()事件,同时在onclick函数中保留“this”引用?
- 在对象原型方法中的setInterval / setTimeout内引用“this”
- 在JavaScript中,为什么“0”等于false,但是如果通过“if”testing,它本身不是错误的?