访问变量的其他功能,而无需使用全球变量
-
03-07-2019 - |
题
我听到各种各样的地方,全球变量本质上都是讨厌的和邪恶的,但当做一些非面向对象的Javascript,我看不出如何避免他们。说我有一个功能,产生一个数使用一个复杂的算法采用随机号码之类的东西,但我需要继续使用特定数目在其他一些功能,这是一个回或东西,所以不可能是部分的同样的功能。
如果最初产生的数目是当地可变的,它不会从访问,在那里。如果该职能是对象的方法,我可以让数量的财产,但是他们不和,它似乎有点过于复杂的改变整个程序结构来做到这一点。是一个全球性的可变真的那么坏吗?
解决方案
做一个变量计算在功能上可见,在功能B,你有三个选择:
- 让一个全球性的,
- 使它的对象的财产,或
- 通过它作为一个参数的时候叫B从A.
如果你的节目是相当小的那么全局不是那么糟糕。否则我会考虑采用第三种方法:
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'
}
没有人会因为做上述事情而对你大喊大叫。
考虑使用名称空间:
(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
ed属性,例如 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));
上面并不完全是一个curried函数,但是它实现了维护现有值而不向全局命名空间添加变量或者需要一些其他对象存储库的结果。
如果另一个函数需要使用变量,则将其作为参数传递给函数。
全球变量本身并不是恶劣的。只要它们使用得当,它们就没有问题。
如果您有可能重用此代码,那么我可能会努力使用面向对象的视角。使用全局命名空间可能很危险 - 由于变量名称被重用,您将面临很难发现错误的风险。通常我首先使用面向对象的方法,而不仅仅是简单的回调,这样我就不必重写了。我认为,只要你在javascript中拥有一组相关的函数,它就是面向对象方法的候选者。
另一种方法是我从道格拉斯克罗克福德论坛帖子中找到的( 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
现在可以从任何其他函数中访问对象属性。
我发现这对原始问题非常有用:
返回你想在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();
我不知道您的问题的具体细节,但如果该函数需要该值,那么它可以是通过该调用传递的参数。
Globals被认为是错误的,因为全局状态和多个修饰符可能会导致难以遵循的代码和奇怪的错误。对许多摆弄东西的演员来说,可能会造成混乱。
你可以使用自定义的jQuery事件完全控制javascript函数的执行(并在它们之间传递变量)....我被告知这不可能在这些论坛上,但我有一些工作正是这样做的(甚至使用ajax调用)。
这是答案(重要提示:这不是经过检查的答案,而是我的回答“Emile”):