我从各种各样的地方听说全局变量本质上是讨厌和邪恶的,但是当做一些非面向对象的Javascript时,我看不出如何避免它们.假设我有一个使用随机数和东西使用复杂算法生成数字的函数,但我需要在其他函数中继续使用该特定数字,这是一个回调或其他函数,因此不能成为同一函数的一部分.
如果最初生成的数字是局部变量,那么就无法访问它.如果函数是对象方法,我可以将数字作为属性,但它们不是,并且看起来有点过于复杂,以改变整个程序结构来执行此操作.全局变量真的如此糟糕吗?
我想在这里你最好的选择可能是定义一个单一的全球范围的变量,并且有倾倒的变量:
var MyApp = {}; // Globally scoped object function foo(){ MyApp.color = 'green'; } function bar(){ alert(MyApp.color); // Alerts 'green' }
做上述事情的人不应该对你大喊大叫.
要使函数A中计算的变量在函数B中可见,您有三个选择:
使它成为一个全球的,
使它成为一个对象属性,或
从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
,同时仍保留访问本地定义.
您正在寻找的是技术上称为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函数,但它实现了维护现有值的结果,而无需向全局命名空间添加变量或者需要一些其他对象存储库.