ueditor在使用严格模式时报错Uncaught TypeError: 'caller', 'callee', and 'arguments'

字号+ 编辑: 呆头鹅甲 修订: 呆头鹅甲 来源: 原创 2018-04-29 12:30 我要说两句(4)

最近在调试electron桌面程序的时候发觉百度ueditor的prototype(原型)方法当中报错Uncaught TypeError: 'caller', 'callee', and 'arguments', 无法轻易取消electron严格模式约束, 那么如何解决这个问题呢?

这里只是拿实际应用遇到的问题当个例子, 百度ueditor植入electron遇到了很多坑, 这是其中的一个。由于使用了严格模式,ueditor一些语法会无法通过, 只能通过修改写法来解决问题。

如果直接看ueditor.all.min.js是没法阅读的, 这里我们打开ueditor.all.js来看其中一行代码:

if (editor.options.wordCount) {
    function countFn() {
        setCount(editor,me);
        domUtils.un(editor.document, "click", arguments.callee);
    }
    domUtils.on(editor.document, "click", countFn);
    editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip");
}

报错的代码就是arguments.callee这部分, 原因是全局采用了use strict也就是严格模式, js官方说arguments.callee的代价太高, 故而在今后的语法层面上抛弃了这种写法, 总之既然要用到js的功能特性, 只好顺着人家的想法来, 好了废话不多说, 我们找到上文不远处的一行代码, 查看到这堆代码是一个闭包内生存的东西, 原文如下:

    editor.addListener('ready', function () {

那么只需要把这个匿名闭包函数随便起一个名字, 例如WK, 就像这样:

    editor.addListener('ready', function WK() {

ok, 接下来再在对应的位置改掉arguments.callee就可以了:

if (editor.options.wordCount) {
    function LOOKATME() {
        setCount(editor,me);
        domUtils.un(editor.document, "click", WK);
    }
    domUtils.on(editor.document, "click", LOOKATME);
    editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip");
}

收工。

注意, 在修改时候,要仔细看上下文,找到上一级的匿名闭包函数, 而不是随便乱找一个起个名对上就行了。

阅完此文,您的感想如何?
  • 鼓掌

    10

  • 鄙视

    7

  • 开心

    8

  • 愤怒

    5

  • 可怜

    4

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • 使用electron-forge和cnpm命令来写一个简单的electron桌面应用

  • UEditor百度编辑器中各种html标签被过滤掉的解决办法

  • JS的Timeout定时器怎么写成无限循环的?

我要说说
网上宾友点评
1楼 IP113.209.*.*的嘉宾说道: 很久前
你上一个函数写wk, 下一个功能就得写wk, 怎么写成Fn了?

2楼 IP113.209.*.*的嘉宾说道: 很久前
能改一下吗

3楼 IP106.50.*.*的嘉宾说道: 很久前
垃圾百度也不更新了

4楼 IP121.69.*.*的嘉宾说道: 很久前
好使
ueditor在使用严格模式时报错Uncaught TypeError: 'caller', 'callee', and 'arguments'