收藏
回答

小程序中的App、Page、global三者的关系

框架类型 问题类型 终端类型 操作系统 微信版本 基础库版本
小程序 Bug 微信iOS客户端 6.7.1 2.2.2

场景

在某些场景下,我们需要覆盖App或Page做一些自定义处理,就像web开发中我们经常覆盖XMLHttpRequest对象一样。

global.App = function CustomApp(...args) {
 
    // 扩展逻辑...
 
    App(...args)
 
}


遇到的问题

如果未关闭“ES6转ES5”,以上的写法会报错“Maximum call stack size exceeded

这个好理解,因为执行`App(...args)`时,App已经指向了`CustomApp`,是一个死循环。

但是,如果启用“ES6转ES5”,则不报错。

启用“ES6转ES5”之后,global是这样一个对象(不包含App、Page):

{
    "process": {
        "env": {}
    },
    "__core-js_shared__": {
        "versions": [{
                "version": "2.5.7",
                "mode": "pure",
                "copyright": "© 2018 Denis Pushkarev (zloirock.ru)"
            }],
        "keys": {
            "IE_PROTO": "Symbol(IE_PROTO)_1.npx70g8i3j"
        },
        "wks": {
            "toStringTag": "Symbol(Symbol.toStringTag)_2.npx70g8i3j",
            "iterator": "Symbol(Symbol.iterator)_3.npx70g8i3j",
            "species": "Symbol(Symbol.species)_4.npx70g8i3h"
        }
    }
}


疑问

1、为什么是否启用“ES6转ES5”,global对象不一致?

2、启用“ES6转ES5”之后,global对象不包含App、Page,那么App、Page指向谁(挂载在哪里)?

回答关注问题邀请回答
收藏

2 个回答

  • 小程序技术专员-june
    小程序技术专员-june
    2018-08-09

    不要使用global,如果你想覆盖App或Page构造器的话,可以直接重新赋值给Page或App,但是并不是很推荐这么做。你可以直接封装一个新的构造器,比如 module.exports = function MyApp(args) { App(args) } 这样的。

    2018-08-09
    有用
    回复 4
    • 风痕
      风痕
      2018-08-09

      你好,业务代码肯定是不会这么写的,一般是引入library需要覆盖Page或Vue,会需要拦截处理(跟web拦截xhr一样),因为这样处理就不需要依赖方做显示改动


      所以可否解释一下global、App、Page三者在是否启用“ES6转ES5”的两个场景下的关系,避免后来者采坑。

      2018-08-09
      回复
    • 僵尸吃掉了我的脑子
      僵尸吃掉了我的脑子
      2018-08-13回复风痕

      下文呢???

      2018-08-13
      回复
    • 无可
      无可
      2018-09-01回复僵尸吃掉了我的脑子

      我也一样疑惑了好久,等了好久,还是没有大佬来解答

      2018-09-01
      回复
    • 黄昏
      黄昏
      2019-08-28
      global的存在都没有文档说明 要不要用 为什么不要用 要说明下 黑盒啊
      2019-08-28
      回复
  • 僵尸吃掉了我的脑子
    僵尸吃掉了我的脑子
    2018-09-03

    感觉我们平明百姓好可怜哦

    2018-09-03
    有用
    回复
登录 后发表内容