Javascript 访问函数内部的外部文本类

Javascript 访问函数内部的外部文本类,javascript,jquery,Javascript,Jquery,我所拥有的是这样的: jQuery(function($) { 'use strict'; var App = { init: function() { App.startTool(); } [...] 当我尝试调用App.init()时从另一个文件中,它表示未定义应用程序 我试图用jasmine做一些测试,我也有同样的错误 我如何从外部文件进入这个嵌套在简单函数中的“文字类”呢?如果它没有作为全局文件公开,那么您就不能触摸它 您必须将其放入全局范围内

我所拥有的是这样的:

jQuery(function($) {

  'use strict';

  var App = {

    init: function() {
      App.startTool();
    }
[...]
当我尝试调用App.init()时从另一个文件中,它表示未定义
应用程序

我试图用jasmine做一些测试,我也有同样的错误


我如何从外部文件进入这个嵌套在简单函数中的“文字类”呢?

如果它没有作为全局文件公开,那么您就不能触摸它

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

jQuery(function($) {

  'use strict';

  var App = {

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

  }

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


});

有趣的是,它在document.ready之前是不存在的,不知道为什么要用ready包装它。初始化调用应在就绪时调用。所以,您要做的是在小部件首先注册的内容上设置竞争条件

如果它不是作为一个整体暴露的,你就不能触摸它

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

jQuery(function($) {

  'use strict';

  var App = {

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

  }

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


});

有趣的是,它在document.ready之前是不存在的,不知道为什么要用ready包装它。初始化调用应在就绪时调用。所以,您要做的是在小部件首先注册的内容上设置竞争条件

如果您想在功能之外使用应用程序,则需要使应用程序在全球范围内可用:

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

    // attach it to window instead of using var
    window.App = {
        init: function() {
            App.startTool();
        }
    };
});

如果要从功能外部使用
应用程序,您需要使其在全球可用:

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

    // attach it to window instead of using var
    window.App = {
        init: function() {
            App.startTool();
        }
    };
});

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;
}())
关于函数作用域的更多信息:在函数中声明的变量不能从该函数的外部看到。在函数外部声明的变量可以从函数内部看到。因此,如果希望对象是全局对象,则需要在任何函数外部声明它,或者将其设置为已在函数外部声明的对象的属性。在浏览器中,窗口对象默认为全局对象。其他环境(如nodejs或rhino)将有自己的全局对象

<> P>重要的是理解JS作用域是如何工作的,因为它是语言的许多更强大的特征背后的基础,特别是闭包和模块模式。
有些人还提到了名称空间的好处。在这种情况下,这是一个很好的观点。为库或应用程序使用单个全局变量可以避免与可能使用的其他库或脚本发生冲突。然后,可以将其他变量附加到该全局命名空间变量,并将其作为该对象的属性引用。因此,与其直接调用
App.init
,不如调用
myProgram.App.init()

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;
}())
关于函数作用域的更多信息:在函数中声明的变量不能从该函数的外部看到。在函数外部声明的变量可以从函数内部看到。因此,如果希望对象是全局对象,则需要在任何函数外部声明它,或者将其设置为已在函数外部声明的对象的属性。在浏览器中,窗口对象默认为全局对象。其他环境(如nodejs或rhino)将有自己的全局对象

<> P>重要的是理解JS作用域是如何工作的,因为它是语言的许多更强大的特征背后的基础,特别是闭包和模块模式。
有些人还提到了名称空间的好处。在这种情况下,这是一个很好的观点。为库或应用程序使用单个全局变量可以避免与可能使用的其他库或脚本发生冲突。然后,可以将其他变量附加到该全局命名空间变量,并将其作为该对象的属性引用。因此,与其直接调用
App.init
,不如调用
myProgram.App.init()

以某种方式将其公开为全局名称空间。如果你真的想用大量变量污染全局名称空间,你也可以这样做?我没有,因此有一个名称空间来保存内容。@epascarello取决于项目范围。如果页面足够小,我不怕忽略适当的名称空间:-)以某种方式将其公开为全局名称空间。如果你真的想用大量变量污染全局名称空间,你也可以做
window.App=App
?我没有,因此有一个名称空间来保存内容。@epascarello取决于项目范围。如果页面足够小,我不怕忽略适当的名称空间:-)如何/在哪里调用App.init()?在中,它工作正常。如何/在何处调用App.init()?就“最佳”解决方案而言,我可能会建议使用名称空间路由。但无论如何,您都必须声明函数之外的内容。就“最佳”解决方案而言,我可能建议使用名称空间路由。但无论如何,您都必须声明函数之外的内容。