这个闭包是有效的:
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? -----------------------------
};出于学术上的好奇心,我不打算在生产代码中这样做
intro to the y-combinator
发布于 2010-12-16 04:15:31
不,这是不可能的,因为在定义object文本时,变量o是未定义的,并且在定义时的this引用没有引用o。
如果您在外部函数中使用了对this的临时引用,并将其传递到闭包中,那么它会起作用,但您将无法传入一个对象来从中获取foo属性。
var o = {
foo: 5,
handler:function(){
var self = this;
return function() {
alert(self.foo);
};
}
};
var h = o.handler();
h();发布于 2010-12-16 04:39:44
正如其他人指出的那样,对象文字本身不可能做到这一点。但是,这个过程是可以包装的。它是否“增加了什么”是有争议的。这与Y-Combinator不同(可能只有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上的原型链有一些微妙的问题,如果有的话--这是给读者的练习。
祝你编码愉快。
发布于 2010-12-16 04:16:53
你可以在这里使用this关键字:
var o = {
foo: 5,
handler: function() {
alert(this.foo);
}
};这是更简单的方法..。实际上,您的方法甚至是不可能的,因为当您引用o时并没有定义它。
https://stackoverflow.com/questions/4454395
复制相似问题