我可以使用y-combinator获取此闭包的对象引用吗?

时间:2010-12-15 20:10:37

标签: javascript closures y-combinator

这个闭包有效:

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

3 个答案:

答案 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