下划线模板在调试器中不起作用

Underscore template doesn't work in debugger

// run with console open
//and paste following when you hit the debugger:

/*
_.templateSettings = {
  interpolate: /\{\{(.+?)\}\}/g
};

var template = _.template("Hello {{ name }}!");

console.log(template({name: "Mustache"}))
*/
debugger
//should return:
//underscore-min.js:5Uncaught TypeError: Cannot read property 'call' of undefined

//out of debugger though, it works:
_.templateSettings = {
  interpolate: /\{\{(.+?)\}\}/g
};
var template = _.template("Hello {{ name }}!");
console.log(template({name: "Mustache"}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

我无法在调试器中 运行 underscore's sample template 编码(我想在控制台中使用实际数据)。

  1. .js 文件中的代码 运行 没问题。 ✓
  2. 页面加载后粘贴到控制台中 运行没问题。 ✓
  3. 在调试器断点时粘贴 - 不起作用。 ✘

    _.templateSettings = {
        interpolate: /\{\{(.+?)\}\}/g
    }
    
    var template = _.template("Hello {{ name }}!");
    
    template({name: "Mustache"});
    

    错误:

    underscore.js:1461 Uncaught TypeError: Cannot read property 'call' of undefined
    

编辑:


template({name: "Mustache"});

上的错误 下划线版本 1.8.3 的

Line 1461

var template = function(data) {
  return render.call(this, data, _);
};

这是 Function 实例化(第 1454 行下划线)的症状,可以使用以下语句重新创建:

new Function('return true;')

在浏览器中打开任何页面(即使是这个),将其复制到控制台并执行,它将打印以下内容:

function anonymous() {
    return true;
}

但是,如果页面当前在调试器中暂停,语句returns undefined。我在 Firefox 中尝试了 运行,它也不起作用,甚至 return。

我无法解释在调试器中暂停时对 V8 (Chrome) 或 SpiderMonkey (Firefox) Javascript 引擎的影响。

如果您真的需要它,这里有一个解决方法:https://jsfiddle.net/na4Lpt7L/

var source = "Hello {{ name }}!";
debugger;
var template = _.template(source);
debugger;

第一个断点命中时:

> source = "Goodbye {{ name }}!";
< "Goodbye {{ name }}!"

现在继续执行,在第二个断点处:

> template({name: "Mustache"});
< "Goodbye Mustache!"

如果你想尝试几个选项,我会说坚持下去 (while (source.length) { ... })