2

Подчеркивание шаблон не работает отладчик

// 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"});

Line 1461 из Underscore версии 1.8.3:

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

Какая версия подчеркивания? Какая строка в вставленном коде вызывает ошибку? Что находится в строке 1461 версии underscore.js, которую вы используете? –

+0

Ответа на этот вопрос (see edit) – Ashbury

+0

Где контрольная точка? Это внутри подчеркивание? –

ответ

2

Это симптом Function конкретизации (подчеркивание линии 1454), и он может быть воссоздан с помощью следующего оператора:

new Function('return true;') 

С любой страницы, открытой в браузере (даже это один), скопировать это в консоль и выполнить, он будет печатать следующее:

function anonymous() { 
    return true; 
} 

Однако если страница находится паузы в отладчике эля tatement возвращает undefined. Я попытался запустить то же самое в Firefox, он тоже не работает, даже не возвращается.

Я не могу объяснить влияние на Javascript двигателей V8 (Chrome) или SpiderMonkey (Firefox), когда они приостановлены в отладчике.

Если вам действительно нужно, вот обходной путь: 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) { ... })

+0

Вы видели [видео] (https://vimeo.com/248018117)? Пароль - это файл Passsword [file] (https://ufile.io/okxmk) здесь без отладчика; точка останова или даже console.log внутри _.template Знаете ли вы, почему –