我想创建自己的命名空间,类似于JQuery的$
(function(app) {
app.fn.log = function(data) {
console.log(data);
};
}(app));
app.log("data");
但是这段代码返回了一个错误 - 未捕获的引用错误:app未定义
我该如何创建自己的命名空间?
我想创建自己的命名空间,类似于JQuery的$
(function(app) {
app.fn.log = function(data) {
console.log(data);
};
}(app));
app.log("data");
但是这段代码返回了一个错误 - 未捕获的引用错误:app未定义
我该如何创建自己的命名空间?
$
,如下所示://Global script declaration
var NAMESPACE = {};
//Check if you need to initialize your namespace
NAMESPACE.FooSpace = NAMESPACE.FooSpace || {};
//Some other script
NAMESPACE.FooSpace = (function($) {
function Foo1() {
}
function Foo2() {
return $.getSomething(); //some existing function inside of someObjectWithANonConflictingName object
}
return { Foo1: Foo1, Foo2: Foo2 };
})(someObjectWithANonConflictingName);
//somewhere else in code (call as a constructor function)
var foo = new NAMESPACE.FooSpace.Foo1();
//somewhere else in code (call as regular function)
var foo2 = Foo2();
NAMESPACE
对象中,即可拥有重叠的名称。NAMESPACE
对象中。window.app = {};
(function(app) {
app.log = function(data) {
console.log(data);
};
}(app));
app.log("data");
jQuery对它的fn
有一些不同的处理方式:当您使用$('selector')
语法查找需要处理的元素时,jQuery会返回一个特殊的wrapper,其中包含了您添加的所有fn.func
样式定义以及内置函数。
因此,如果您需要实现某种可扩展性,您应该首先考虑这种包装。例如:
window.app = function(p) {
// do whatever you need
var wrapper = {
// standard common fields
};
if (app.fn) {
// extend wrapper with app.fn
}
return wrapper;
};
顺便问一下,您想解决什么问题?
在您的情况下,有一个例外,因为在匿名函数执行时 app
未被定义。
line
?是行号吗? - Sergey Metlovapp
。你将app作为参数传递给你的IIFE,但是app没有被定义!如果你想把jQuery作为app访问,只需像这样调用你的IIFE并传递jQuery对象:(function(app) {
app.fn.log = function(data) {
console.log(data);
};
}($)); // where $ is your jQuery.
并且
$.log("data");
注意!log函数将在IIFE的作用域内外都可用!
app
在哪里定义的?该函数需要一个app
参数,而你传递了一个不存在的app
变量... - elclanrs