立即执行函数报错Uncaught TypeError: (intermediate value) is not a function.
文章目录
立即执行函数报错Uncaught TypeError: (intermediate value) is not a function.前言一、现象二、解决三、原因分析总结前言
立即执行函数报错Uncaught TypeError: (intermediate value) is not a function.
一、现象
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><script>// 如果应用 加载 刚开始加载A应用 window.a,然后加载B应用(window.a);// 单应用切换时, 沙箱:创造一个干净的环境给子应用使用,当切换时可以选择丢弃和回复属性// 快照沙箱: 一年前拍一张照片 一年后再拍一张 (将前后对比的区别保存起来) 应用: 将区别应用回到一年前 或者是回复到一年前后再此恢复到当前// 快照沙箱代码实现class SnapshotSandbox {constructor() {this.proxy = window // window属性this.modifyPropsMap = {} // 记录在window上的修改this.active() // 恢复沙箱(恢复到当前状态)}active() {this.windowSnapshot = {} // 拍照for(let prop in window) {if(window.hasOwnProperty(prop)) {this.windowSnapshot[prop] = window[prop]}}Object.keys(this.modifyPropsMap).forEach(p=>{window[p] = this.modifyPropsMap[p]})}inactive() {for(let prop in window){if(window.hasOwnProperty(prop)) {if(window[prop] !== this.windowSnapshot[prop]) {this.modifyPropsMap[prop] = window[prop];window[prop] = this.windowSnapshot[prop]}}}}}let sandbox = new SnapshotSandbox()// 应用的运行, 从开始到结束,切换后不会影响全局((window)=>{window.a = 1window.b = 2console.log(window.a, window.b)sandbox.inactive()console.log('失活(回到一年前)',window.a, window.b)sandbox.active()console.log('激活(恢复沙箱)',window.a, window.b)})(sandbox.proxy)// 如果是多个子应用不能使用这种方式 // 代理沙箱可以实现多应用沙箱,把不同应用用不同的代理处理</script></body></html>
二、解决
三、原因分析
出现这种bug的原因:在你的代码中,同时定义了变量、匿名函数或者闭包函数,并且该变量定义在了这两类函数之前,如果变量后面省略了分号,js就会自动解析为匿名函数进行自调,会被认为是变量名而不是方法,从而会导致报错;所以变量后面以及闭包函数后面都需要加上分号。
如下图示例:加上分号后bug得以解决
总结
看到问题不要怕,锤它