【问题标题】:Reference to variable is undefined对变量的引用未定义
【发布时间】:2012-06-14 03:22:25
【问题描述】:

我正在尝试调用一个我知道存在于变量上的函数,但由于某种原因,我无法从传递的函数onUpdate 中调用 - 任何想法伙计们 - 对不起新人

//set up the mirror when view is expanded
function attachMirrorListener(section, mirror) {
    var textarea = document.getElementById(mirror.attr('id'));
    var input = $(mirror.data('input'));
    var myCodeMirror;
    section.click(function() {
        if(section.hasClass('open') && !section.hasClass('mirror-added')) {
            section.addClass('mirror-added');

            input.attr('value','test value!!');
            myCodeMirror = CodeMirror.fromTextArea(textarea, {
                onUpdate : function(){ myCodeMirror.save(); //does not work here!!
                    },
            });

        }
        console.log(myCodeMirror);
        myCodeMirror.save(); //works here
    });


}
});

更新

我尝试重新排列代码,仍然无法正常工作

jQuery(document).ready(function($) {
    var _codeMirror;
    //setup code-mirror
    $('.customize-section').each(function() {
        var section = $(this);
        var mirror = section.find('textarea.wpec-tc-code-mirror');
        if(mirror.length > 0) {
            attachMirrorListener(section, mirror);
        }
    });
    //set up the mirror when view is expanded
    function attachMirrorListener(section, mirror) {
        var textarea = document.getElementById(mirror.attr('id'));
        var input = $(mirror.data('input'));

        section.click(function() {
            if(section.hasClass('open') && !section.hasClass('mirror-added')) {
                section.addClass('mirror-added');
                _codeMirror = CodeMirror.fromTextArea(textarea, {
                    onUpdate : codemirrorcallback,
                });

            }
        });
        function codemirrorcallback() {
            _codeMirror.save();
            input.val(escape(textarea.value));
        }

    }

});

这是来自 chrome 控制台的错误日志

Uncaught TypeError: Cannot call method 'save' of undefined codemirror.js:26 codemirrorcallback codemirror.js:26 endOperation codemirror.js:1864 instance.(anonymous function) codemirror.js:1871 CodeMirror codemirror.js:95 CodeMirror.fromTextArea codemirror.js:2114 (anonymous function) codemirror.js:19 f.event.dispatch load-scripts.php:3 f.event.add.h.handle.i

【问题讨论】:

  • 去掉onUpdate后多余的逗号还能用吗?
  • 是否有可能在CodeMirror 的实际初始化过程中调用了onUpdate 回调,从而导致对myCodeMirror 的分配仍未发生?还是您稍后会收到错误消息?尝试在两个myCodeMirror.save() 行设置一个断点,看看哪个先执行。另外,您确定不能在onUpdate 回调中将CodeMirror 实例引用为this,从而避免使用myCodeMirror 引用吗?
  • 是的,不幸的是在 onUpdate 中使用它还没有 save() 功能。我做了一个onUpdate : console.log(this); 并没有保存

标签: javascript variables scope


【解决方案1】:

赋值运算符从右到左工作。所以,当你第一次调用myCodeMirror.save() 时,myCodeMirror 仍然是未定义的。

var myCodeMirror; //undefined

myCodeMirror = CodeMirror.fromTextArea(textarea, {
    onUpdate : function() { 
        myCodeMirror.save(); //still undefined 
    }
});

您应该改为从内部 onUpdate 函数中调用 this.save()

【讨论】:

  • 对不起,技术也不起作用。查看上面的错误报告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多