У моей функции каким-то образом нет доступа к ее закрытию родителя и отсутствуют переменные. Как?

В моей функции верхнего уровня Im импортирует некоторые зависимости, используя require.js. И theyre там, никакая проблема. В рамках этой функции я определяю функцию обратного вызова и пытаюсь использовать некоторые из переменных, импортированных через require.js, то есть переменные в родительском закрытии.

И они просто присутствуют там, что подтверждается точкой останова и заглядывают на панель переменных Scope Variables Chrome.

Я понимаю, что fn.apply и друзья устанавливают только контекст до this, а не то, что они могут уничтожить ссылку на закрытие или изменить цепочку областей.

define([
    'backbone',
    'backbone.vent',
    'app/utils/foo',
    'app/services/intent'
], function(Backbone, Vent, Foo) {
    'use strict';

    // Backbone, Vent, and Foo are defined here

    Vent.on('myevent', function(options) {
        // Backbone is defined here, but not Vent or Foo.
    });
});

Как это возможно?

И как я могу его исправить?

Ответ 1

Я подозреваю, что функция, в которой вы установили точку останова, содержит ссылку на Backbone, но не Vent или Foo.

Задержки несколько дороже во время выполнения JS. Это требует, чтобы механизм завершал объект таким образом, чтобы он сохранял внутренние ссылки на эти переменные, чтобы они могли быть правильно разрешены во время выполнения функции. Поэтому по соображениям производительности Chrome (и я подозреваю большинство других двигателей) имеет тенденцию оптимизировать любые переменные замыкания, которые фактически не используются при компиляции script. Это может привести к некоторым запутывающим вещам при отладке, но это следует ожидать.

Рассмотрим следующий пример (Примечание x, y и z определены в области внешней функции, а не в глобальной области):

window.onload = function() {
  var x = 1, y = 2, z = 3;
  (function() {
    debugger;
    x++;
  })();
}

Ответ 2

если вы используете Eval() внутри вашего закрытия Chrome не будет использовать какую-либо его оптимизацию производительности, что означает, что вы можете увидеть значение y