这个闭包有效:
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? -----------------------------
};
出于学术上的好奇心,我不打算在生产代码中这样做
答案 0 :(得分:1)
不可以,这是不可能的,因为在定义对象文字时,变量o
未定义,并且定义时的this
引用未引用{{ 1}}。
如果你在外部函数中使用了对o
的临时引用并将其传递给了闭包,它会起作用,但是你无法传入一个对象来获取this
属性出来的。
foo
答案 1 :(得分:1)
对于其他人指出的对象文字本身,这是不可能的。但是,该过程可以包装。不管它是否“添加任何东西”都是值得商榷的。这与Y-Combinator(可能是它的一半?)不一样,因为它不是试图给出一个“递归名称”(据我所知,Y-Combinators假设一流的函数和闭包或者一个模拟这样的方法)。
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
上的原型链有一些微妙的问题,如果有的话 - 这是读者的练习。
快乐的编码。
答案 2 :(得分:0)
您可以在此处使用this
关键字:
var o = {
foo: 5,
handler: function() {
alert(this.foo);
}
};
这是一种更简单的方法......实际上,您的方法甚至不可能,因为当您引用它时未定义o
。