我的 Rails 4 应用程序中的一个 View 会加载一个简单的 JavaScript,以便在页面加载后创建 Ace 编辑器的实例...
$(function() {
var editor = ace.edit("editor");
}):
在该 View 中,我有一个简单的 ajax 按钮...
<%= button_to "Set Content", {controller: :pages, action: 'set_content'}, remote: true %>
需要一些不显眼的 JavaScript...
editor.setValue("New content has been set");
但这不起作用。我猜这不起作用,因为 editor
未定义。由于 ajax 调用会默默地失败,而且我不知道如何使用与调试正常 javascript 代码相同的 Chrome 工具来调试不引人注目的 javascript 代码,因此我无法验证这是否是实际问题,但这是我的最佳猜测。
我的印象是,如果我编写 var 编辑器
,那么它就会被声明为一个全局变量,我的不显眼的 javascript 应该能够访问它。
我的问题是...
- 如何访问不显眼的 JavaScript 代码中的全局变量?
- 由于全局变量被认为是邪恶的,是否有更好的方法从我不显眼的 JavaScript 中访问
editor
变量?
预先感谢您的智慧!
最佳答案
当您在函数内使用 var 关键字时,该变量的作用域是该函数的局部作用域,因此您对全局作用域的假设是错误的。要使变量成为全局变量,请在函数外部声明它:
var editor;
$(function(){
editor = ace.edit('editor');
});
或者,您可以简单地引用 window 对象(这是浏览器中的“全局”对象
$(function(){
window.editor = ace.edit('editor');
});
关于避免全局变量,使用单个全局变量(通常称为“app”或“myCompany”等)是合理的,以提供可全局访问的命名空间。
var app = {};
$(function(){
app.editor = ace.edit('editor');
});
这至少限制了新变量的范围,这样您就不会错误地覆盖全局变量。然而,避免全局变量的真正答案在于应用程序的整体架构,如果不查看更多代码,就无法真正解决这个问题。一般来说,如果您编写的所有代码都在 jquery 就绪函数内,那么您不需要全局变量。与简单使用 jquery 时常见的临时代码相比,Angular、ember 和 Backbone 等框架为此类事物提供了更好的结构。
关于javascript - 如何在 Rails 应用程序中以不显眼的 javascript 访问全局 javascript 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199650/