我可以使用Y-Combinator获取此关闭的对象参考吗?
-
10-10-2019 - |
题
这个关闭有效:
var o = {
foo: 5
};
o.handler = function(obj){
return function() {
alert(obj.foo);
};
}(o);
o.handler(); //alert('5')
是否可以在线定义处理程序,也许可以使用类似于Y-Combinator操作?
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-Combinator不同(也许是一半吗?),因为它没有试图给出“递归名称”(据我所知,Y-Combinator都会假设一流的功能和封闭或闭合或模拟此类的方法。
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
指参考时未定义。
不隶属于 StackOverflow