1

我所拥有的是这样的:

jQuery(function($) {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }
[...]

当我尝试App.init();从另一个文件调用时,它会说App is not defined.

我正在尝试用茉莉花创建一些测试,但我遇到了同样的错误。

我怎样才能从外部文件进入这个嵌套在一个简单函数中的“文字类”?

4

3 回答 3

4

如果它没有作为全局公开,那么您将无法触摸它。

您必须将其放入全局范围内的某个命名空间中。

jQuery(function($) {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }

  }

  if (!window.myNamespace) {
      window.myNamespace = {};
  }
  myNamespace.App = App;


});

有趣的是,它在 document.ready 之前不会存在,不知道为什么要使用 ready 包装它。应该在准备就绪时调用 init 调用。因此,您正在对首先注册的小部件设置竞争条件。

于 2013-03-05T13:57:28.400 回答
4

Javascript具有函数范围。这意味着在函数中定义的变量仅在该函数中可见。要从函数外部访问此变量,您需要在函数外部声明它,将其直接附加到窗口或其他全局对象,或者将其作为函数的值返回。

对外声明:

var App;
    jQuery(function($) {

  'use strict';

  App = {

    init: function() {
      App.startTool();
    }
[...]

附加到窗口或其他全局命名空间:

    jQuery(function($) {

  'use strict';

  window.App = {  //or namespace.App where namespace can be another global variable.

    init: function() {
      App.startTool();
    }
[...]

你包装它的方式你将无法返回值,但如果它是一个不同的函数,你可以这样做:

var App= (function() {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }
return App;
}())

关于函数范围的更多信息:在函数内声明的变量不能从该函数外部看到。从函数内部可以看到在函数外部声明的变量。所以如果你想让一个对象是全局的,你需要在任何函数之外声明它,或者将它设置为已经在函数之外声明的东西的属性。在浏览器中,window 对象默认是全局的。其他环境,如 nodejs 或 rhino 将拥有自己的全局对象。

理解 JS 作用域是如何工作的很重要,因为它是该语言许多更强大功能的基础,尤其是闭包和模块模式。

有些人还提到了命名空间的好处。对于这种情况,这是一个很好的观点。为库或应用程序使用单个全局变量可以避免与您可能正在使用的其他库或脚本发生冲突。然后,您可以将其他变量附加到该全局命名空间变量,并将它们作为该对象的属性进行引用。因此,与其App.init直接调用,不如调用myProgram.App.init()例如。

于 2013-03-05T13:58:12.283 回答
0

App如果要从函数外部使用它,则需要使其全局可用:

jQuery(function($) {
    'use strict';

    // attach it to window instead of using var
    window.App = {
        init: function() {
            App.startTool();
        }
    };
});
于 2013-03-05T13:58:02.520 回答