Могу ли я использовать Y-комбинентатор для получения ссылки на объект для этого закрытия?

StackOverflow https://stackoverflow.com/questions/4454395

Вопрос

это закрытие работает:

var o = {
    foo: 5
};

o.handler = function(obj){
    return function() {
        alert(obj.foo);
    };
}(o);

o.handler(); //alert('5')

Можно ли определить обработчик в линии, возможно, с чем-то похожим на операцию Y-комбинатора?

var o = {
    foo: 5,
    handler: function(obj){
        return function() {
            alert(obj.foo);
        };
    }(o); //pointer to o? -----------------------------
};

вне академического любопытства, я не пытаюсь сделать это в производственном коде

вступление в y-комбинентатор

Это было полезно?

Решение

Нет, это невозможно, потому что во время определения буквального объекта переменная o не определен, и this ссылка во время определения не ссылается o.

Если вы использовали временную ссылку на this Во внешней функции и передал его в закрытие, это сработало, но вы не сможете пройти в объект, чтобы получить foo собственность из.

var o = {
    foo: 5,
    handler:function(){
        var self = this;
        return function() {
            alert(self.foo);
        };
    }
};

var h = o.handler();
h();

Другие советы

Это невозможно с буквальным объектом сам по себе, как указали другие. Однако процесс может быть завершен. Будь то, или нет, «добавляет что -нибудь», спорно. Это не то же самое, что и с комбинентором (возможно, половина?), Потому что он не пытается дать «рекурсивное имя» (насколько я могу сказать, что y-комбинентаторы принимают первоклассные функции и закрытие или способ имитировать такие).

function bindMany (dict, res) {
  res = res || {}
  for (var k in dict) {
    if (dict.hasOwnProperty(k)) {
      var v = dict[p]
      res[k] = v instanceof Function ? v(res) : v
    }
  }
  return res
}

var o = bindMany({
  foo: 5,
  handler: function(obj){
    return function() {
      alert(obj.foo)
    }
  }
})

Не испытывается, но показывает подход, который мог быть взятым. Есть тонкие проблемы с этим и цепочка прототипа на dict/res, если таковые имеются - упражнение для читателя.

Счастливого кодирования.

Вы могли бы просто использовать this Ключевое слово здесь:

var o = {
    foo: 5,
    handler: function() {
      alert(this.foo);
    }
};

Это намного проще подходит ... на самом деле, ваш подход даже невозможен, как o не определяется, когда вы ссылаетесь на это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top