我有以下js(内容概率不重要)
(function() {
var module = {
getAppAbsoluteUrl: getAppAbsoluteUrl,
getAppRelativeUrl: getAppRelativeUrl,
getAppODataApiUrl: getAppODataApiUrl
};
return module;
function getAppAbsoluteUrl() {
return _spPageContextInfo.webAbsoluteUrl;
};
function getAppRelativeUrl() {
return _spPageContextInfo.webServerRelativeUrl;
};
function getAppODataApiUrl() {
return getAppAbsoluteUrl() + "/_api";
};
});
如果上面的代码在一个名为spAppUtils.js的文件中,而在另一个html页面中,我试着调用它,我得到一个未定义的消息。以上不是匿名函数吗?如何从其他页面初始化此功能?我试过引用js无济于事。我错过了什么?
由于
答案 0 :(得分:1)
尝试做这样的事情:
var module = (function() {
// move your functions before your return
// hoisting (http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) will allow you to add them after the return, but doesn't help readability and will likely confuse newcomers
function getAppAbsoluteUrl() {
return _spPageContextInfo.webAbsoluteUrl;
};
function getAppRelativeUrl() {
return _spPageContextInfo.webServerRelativeUrl;
};
function getAppODataApiUrl() {
return getAppAbsoluteUrl() + "/_api";
};
return { // explicitly export your public interface
getAppAbsoluteUrl: getAppAbsoluteUrl,
getAppRelativeUrl: getAppRelativeUrl,
getAppODataApiUrl: getAppODataApiUrl,
test: function () { alert('test') }
};
}()); // execute your anonymous function
module.test()
答案 1 :(得分:1)
要调用该函数,您需要在其后放置()
。
要捕获返回值(您在函数内分配给module
然后返回的对象),您需要一个赋值运算符。
你可以摆脱整个函数的括号。它们只需要将函数声明转换为函数声明,因此您可以立即调用它,但是=
(您需要)也可以这样做。
var myModule = function() {
// ...
}();
答案 2 :(得分:0)
这里有几个问题。首先,在定义所有内容之前返回函数是危险的。有一种称为变量提升的东西会自动将所有声明移到顶部,但我不确定它何时适用。
以下是无法访问代码的基本示例。
(function(){
console.log("gets called");
return;
console.log("unreachable code");
})();
下一个问题是范围之一。
// window scope
(function(){
// new scope
var module = {"hello":"world"};
console.log(module); // object
})();
console.log(module) // undefined
[edit]因此,为了使您的模块可以被其他脚本文件访问,您必须在窗口范围内为它定义一个全局变量。
(function(){
window.module = {...}
})();
答案 3 :(得分:-1)
您可以尝试使用<script>
标记将其直接插入到html中,以查看问题是函数本身还是指向.js文件的链接