为什么我不能引用我的匿名函数

Why can't I reference my anonymous function?

本文关键字:函数 我的 引用 不能 为什么      更新时间:2023-09-26

我有以下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 无济于事。 我错过了什么?

谢谢

尝试做这样的事情:

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()

小提琴

要调用该函数,您需要在它后面放置()

要捕获返回值(您分配给函数内部module然后返回的对象),您需要在它之前使用赋值运算符。

您可以去掉整个函数周围的括号。它们只需要将函数声明转换为函数语句,以便您可以立即调用它,但是拥有一个=(您需要)也可以做到这一点。

var myModule = function() {
// ...
}();

这里有几个问题。首先,在定义所有内容之前返回函数是危险的。有一种叫做变量提升的东西会自动将所有声明移动到顶部,但我不确定它何时适用。

下面是无法访问的代码的基本示例。

(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

[编辑] 因此,为了使您的模块可供其他脚本文件访问,您必须在窗口范围内为其定义一个全局变量。

(function(){
  window.module = {...}
})();

您可以尝试使用<script>标签将其直接插入到html中,以查看问题是函数本身还是指向.js文件的链接