是的,这是另一个关于全局变量的话题。我已经搜索了很多关于它们的信息。但大多数主题只是关于为什么不使用全局变量,我确信我不应该,而且我更想知道如何不使用它们,而且我仍然不确定。
我正在做一个项目,它创造了奇迹,但我目前使用了大约 50 个全局变量,而且这个数字还在不断增加。现在我已经将内容拆分为多个 .js 文件。像 load_chunks.js、load_images.js、render_map.js、player_actions.js、input.js,根据它们的用途来传播功能。我将所有全局变量都放在 settings.js 中。
目前我使用这些全局变量的原因如下:
1.基于其他一些加载后变化不大或根本没有变化的全局变量进行计算。通过执行一次并将其存储在全局变量中,我不再需要再次重复计算。如果我不将它存储在(全局)变量中,Javascript 每秒必须进行多次计算,在某些情况下甚至每秒进行数千次。
2.当很多函数需要全局变量时。就像这个世界变量,我用它来保存世界外观的数据。这个变量是一个多维数组。例如世界[y][x]。 Load_chunks.js 向这个变量添加更多数据,或者如果你移动得太远则删除数据。 render_map.js 中也需要此变量来创建 map ,player_action.js 中也需要此变量,以查看您是否可以踩到该特定位置。
3.设置;因此,除非我在脚本中更改它们,否则变量中的数字将保持不变。我没有遍历我的脚本,也没有在长时间搜索并思考数字是什么后手动更改数字,而是将该数字放入 1 个变量中,并在我的脚本中多次调用该变量。在某些情况下,其他地方也需要这些变量。
我还想提一下,我不使用类,也许正因为这个原因,我从来没有绕过使用全局变量......?
那么我该如何摆脱我的全局变量,或者我不应该吗? 我希望您能向我展示或为我编写一个脚本示例(或指向它的链接),说明我应该如何操作。这是我最快的学习方式。
最佳答案
将变量放入函数闭包中
消除全局变量的一种常见方法是将 is 放在函数闭包中:
(function() {
var declareYourFormerGlobalHere = 0;
// put all code that uses the variable inside this closure
// the variable persists for this code to use, but is not actually global
})();
以下是一些用法示例:
// example keeping track of a running count and a cached DOM element
(function() {
var cntr = 0, obj = document.getElementById("test");
setInterval(function() {
++cntr;
if (obj.value < cntr) {
// do something
} else {
// do something else
}
}, 1000);
})();
// example keeping track of a time of last click
(function() {
var timeOfLastClick = 0;
document.getElementById("run").addEventListener("click", function(e) {
var now = new Date().getTime();
// only process click if more than 2 seconds have passed since last click
if (now - timeOfLastClick > 2000) {
// OK to process the click
}
timeOfLastClick = now;
});
})();
有时,您实际上可以像这样将所有代码或几乎所有代码封装在一个闭包中,并且所有当前全局变量都成为闭包内的局部变量,而不是实际的全局变量。 jQuery 使用这种技术来声明它使用的大量持久变量,其中没有一个是实际的全局范围的。
使用单个命名空间对象
另一种减少全局变量数量的常用方法是使用命名空间概念。在这个概念中,您声明一个单一的全局对象并将其他持久变量作为这个单一全局对象的属性。这仍然留给您一个全局变量,您可以在这个全局变量中拥有任意数量的属性。
var myNamepaceObject = {};
myNamespaceObject.var1 = "foo";
myNamespaceObject.var2 = "whatever";
jQuery 也使用这种技术,因为 jQuery 提供的所有全局可访问函数都可以在 jQuery 对象之外使用,例如 jQuery.extend() 或 jQuery.contains()。 jQuery 公开单个全局变量,然后许多其他全局可访问函数可用作该单个全局对象的属性。
模块模式
通常称为“模块模式”的是上述两种技术的组合,其中您有一个同时使用属性和闭包变量的模块变量。
var MODULE = (function () {
var my = {},
privateVariable = 1;
function privateMethod() {
// ...
}
my.moduleProperty = 1;
my.moduleMethod = function () {
// ...
};
return my;
}());
您可以在这些引用资料中看到对此设计模式的讨论:
JavaScript Module Pattern: In-Depth
关于javascript - 需要关于摆脱全局变量的建议/帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732219/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?