javascript - 如何在 Rails 应用程序中以不显眼的 javascript 访问全局 javascript 变量?

标签 javascript jquery ruby-on-rails ajax

我的 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 应该能够访问它。

我的问题是...

  1. 如何访问不显眼的 JavaScript 代码中的全局变量?
  2. 由于全局变量被认为是邪恶的,是否有更好的方法从我不显眼的 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/

相关文章:

javascript - 所有页面标题中的可疑 javascript(同一服务器上的多个网站)

javascript - 如何在tensorflow.js中提取张量的值?

javascript - leaflet.js 阻止某些事件的传播

javascript - Meteor 全页面刷新加载更多按钮(iron-router)

ruby-on-rails - Ruby on Rails,发送帖子后的路径

javascript - 是否可以模拟按下 'Down' 箭头?

javascript - Chrome 阻止不同来源的请求

jquery - 限制 HTML 下拉列表打开时显示的项目

ruby-on-rails - Windows 版 Git 收到未知协议(protocol)错误

ruby-on-rails - Rails 4 - 在生产服务器上预编译 Assets 后没有 manifest.json