这个关闭有效:

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? -----------------------------
};

出于学术好奇,我不是在生产代码中做到这一点

Y-Combinator的简介

有帮助吗?

解决方案

不,这是不可能的,因为在对象的定义时,变量 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 指参考时未定义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top