wentout
@wentout
JavaScript Developer

Возможна ли передача контекста (Scope) между замыканиями (Closure)?

// рабочий результат
var invoke = function(fn){
  var str = 'var test = \'sss\';';
  alert(fn)
  var fnxt = new Function(str+fn);
  fnxt();
}
var tester = 'alert(test);'

invoke(tester);

// желательный результат
var invoke_real = function(fn){
  var test = 'sss';
  alert(fn)
  // дальше, само собой -- не работает, т.к. test отсутствует для scope tester_real'a
  fn();
}
var tester_real = function(){ alert(test); }

invoke_real(tester_real);


* This source code was highlighted with Source Code Highlighter.
  • Вопрос задан
  • 2385 просмотров
Пригласить эксперта
Ответы на вопрос 3
mark_ablov
@mark_ablov
Не знаю насколько вам подойдет, но только через работу с объектом пришло в голову:

    var invoke_real = 
    {
        real: function(fn)
        {
           this.test = 'sss';
           fn(this);
           this.f();
        }
    };
    var tester_real = function(ctx){ctx.f = function() {alert(this.test);};};

    invoke_real.real(tester_real);

scope наследуется только если функция определена внутри другой функции, так что сомневаюсь что можно сделать значительно проще.
Ответ написан
wentout
@wentout Автор вопроса
JavaScript Developer
То есть, пока, «отсутствие мыслей» завело сюда:

var invoker = {
   init  : function(fn){
    invoker.arr[fn] = window[fn];
    window[fn] = function(){
      var test = 'sss';
      alert('+1 '+test)
      invoker.arr[fn]();
    };
  }
  , del  : function(fn){
    window[fn] = invoker.arr[fn];
    delete invoker.arr[fn];
  }
  , arr  : []
}

var tester = function(){ alert(222); try{ alert(test); }catch(e){ alert(e); /* ref err */ } }

invoker.init('tester');
alert(111);
tester();
alert(333);
invoker.del('tester');
tester();


* This source code was highlighted with Source Code Highlighter.
Ответ написан
Может такой вариант подойдет?

function test(args) {
  console.log(this.title1, test.title1, args.title2); // -> Hello! Hello! Hello World
}
(function(){
  test.__proto__.title1 = 'Hello!';
  test = test.bind(test, {title2: 'Hello World'});
    
})();

test();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы