Могу ли я использовать Y-комбинентатор для получения ссылки на объект для этого закрытия?
-
10-10-2019 - |
Вопрос
это закрытие работает:
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? -----------------------------
};
вне академического любопытства, я не пытаюсь сделать это в производственном коде
Решение
Нет, это невозможно, потому что во время определения буквального объекта переменная 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
не определяется, когда вы ссылаетесь на это.