我所拥有的是这样的:
jQuery(function($) {
'use strict';
var App = {
init: function() {
App.startTool();
}
[...]
当我尝试从另一个文件中调用App.init();
时,它会说App is not defined
。
我正在尝试使用jasmine创建一些测试,我也犯了同样的错误。
如何从外部文件中嵌入这个嵌入简单函数的“文字类”?
答案 0 :(得分:4)
如果它没有暴露为全局,则无法触摸它。
您必须将其放入全局范围内的某个命名空间。
jQuery(function($) {
'use strict';
var App = {
init: function() {
App.startTool();
}
}
if (!window.myNamespace) {
window.myNamespace = {};
}
myNamespace.App = App;
});
这里有趣的事情是它在document.ready之前不会存在,不知道为什么你会希望它包装好。应该准备好调用init调用。所以你要做的就是首先注册哪个小部件的竞争条件。
答案 1 :(得分: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;
}())
关于函数范围的更多内容:函数内部声明的变量无法从该函数外部看到。在函数内部声明的变量可以在函数内部看到。因此,如果您希望对象是全局对象,则需要在任何函数外部声明它,或者将其设置为已在函数外部声明的属性。在浏览器中,窗口对象默认为全局。其他环境如nodejs或rhino将拥有自己的全局对象。
了解JS范围如何工作非常重要,因为它是该语言许多更强大功能的基础,特别是闭包和模块模式。
有些人还提到了命名空间的好处。对于这种情况,这是一个很好的观点。为库或应用程序提供单个全局变量可以避免与可能使用的其他库或脚本冲突。然后,您可以将其他变量附加到该全局命名空间变量,并将它们作为该对象的属性引用。因此,不要直接调用App.init
,而是调用myProgram.App.init()
。
答案 2 :(得分:0)
如果您想在函数外部使用它,则需要使App
全局可用:
jQuery(function($) {
'use strict';
// attach it to window instead of using var
window.App = {
init: function() {
App.startTool();
}
};
});