Я нашел отчет о выпуске v8 , который именно о том, что вы просите.
Теперь, чтобы суммировать то, что сказано в этом выпуске ... v8 может хранить переменные, которые являются локальными для функции в стеке или в объекте «context», который живет в куче. Он будет выделять локальные переменные в стеке, пока функция не содержит никакой внутренней функции, которая относится к ним. Это оптимизация. Если любая внутренняя функция ссылается на локальную переменную, эта переменная будет помещена в объект контекста (т. Е. В куче, а не в стеке). Случай eval
является особенным: если он вообще вызван внутренней функцией, все локальные переменные помещаются в объект контекста.
Причина для контекстного объекта заключается в том, что в общем случае вы можете вернуть внутреннюю функцию из внешней, а затем стек, который существовал во время выполнения внешней функции, больше не будет доступен. Таким образом, все, что имеет доступ к внутренней функции, должно пережить внешнюю функцию и жить в куче, а не в стеке.
Отладчик не может проверить те переменные, которые находятся в стеке. Что касается проблемы, возникающей при отладке, один из участников проекта говорит, что :
Единственное решение, о котором я мог думать, это то, что всякий раз, когда devtools включен, мы уничтожаем весь код и перекомпилируем с принудительным контекстным распределением. Это резко изменило бы производительность при использовании devtools.
blockquote>Вот пример «если какая-либо внутренняя функция относится к переменной, поместите ее в объект контекста». Если вы запустите это, вы сможете получить доступ к
x
в инструкцииdebugger
, хотяx
используется только в функцииfoo
, , которая никогда не называется !function baz() { var x = "x value"; var z = "z value"; function foo () { console.log(x); } function bar() { debugger; }; bar(); } baz();
вместо:
for position in positions:
if positions[position] < 0 and positions[position+1] == 0:
valleys += 1
вам нужно:
for i in range(n):
if positions[i] < 0 and positions[i+1] == 0:
valleys += 1