You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象字面量中自执行函数调用异常:this.fetchLocalStorage不是函数

解决对象字面量中自执行函数调用内部方法报错的问题

这个问题我之前也碰到过,本质是对象初始化时的上下文问题,咱们一步步来拆解原因和解决方案:

为什么会抛出this.fetchLocalStorage is not a function?

当你在对象字面量里用自执行函数给busdata赋值时,这个函数会立即执行,但此时app对象还没有完成初始化(也就是还没被赋值给var app这个变量)。这时候自执行函数里的this指向的是全局上下文(浏览器环境下是window,Node.js里是global,严格模式下则是undefined),根本不是你正在创建的app对象,自然找不到fetchLocalStorage方法。

解决方案

下面提供几种既能一次性获取数据,又能正常调用内部方法的写法:

方案1:先初始化对象,再赋值busdata

先创建包含fetchLocalStorage方法的对象,之后再调用方法给busdata赋值,这时候app已经存在,能正常访问内部方法:

var app = { 
  fetchLocalStorage: function() { 
    // fetching logic here
    return "fetching data..."; 
  } 
};
// 此时app已经初始化完成,可以安全调用内部方法
app.busdata = app.fetchLocalStorage();
console.log(app.busdata); // 输出: fetching data...

方案2:用自执行函数包裹整个对象(闭包方式)

把整个对象的创建放在一个自执行函数里,先定义内部函数,再返回最终的对象。这样busdata赋值时可以直接调用内部定义的fetchLocalStorage,同时也能把方法暴露到最终的对象上:

var app = (function() {
  // 先定义复用的方法
  function fetchLocalStorage() {
    return "fetching data...";
  }
  
  // 返回最终的对象结构
  return {
    fetchLocalStorage: fetchLocalStorage,
    busdata: fetchLocalStorage() // 一次性调用获取数据
  };
})();
console.log(app.busdata); // 输出: fetching data...

方案3:ES6+ 类写法(更优雅的结构化方式)

如果你的环境支持ES6类,可以用类来实现,在构造函数里一次性初始化busdata:

class App {
  constructor() {
    // 构造函数执行时一次性获取数据
    this.busdata = this.fetchLocalStorage();
  }
  
  fetchLocalStorage() {
    return "fetching data...";
  }
}

const app = new App();
console.log(app.busdata); // 输出: fetching data...

补充说明

如果之前不用自执行函数时是用getter(比如get busdata() { return this.fetchLocalStorage() }),那确实每次访问都会触发函数调用。上面的方案都是只在初始化时调用一次方法,后续访问busdata直接取缓存好的值,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Mateusz Sowiński

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:37