首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用y-combinator来获取这个闭包的对象引用吗?

我可以使用y-combinator来获取这个闭包的对象引用吗?
EN

Stack Overflow用户
提问于 2010-12-16 04:10:37
回答 3查看 126关注 0票数 2

这个闭包是有效的:

代码语言:javascript
复制
var o = {
    foo: 5
};

o.handler = function(obj){
    return function() {
        alert(obj.foo);
    };
}(o);

o.handler(); //alert('5')

是否可以定义内联处理程序,也许可以使用类似于y-combinator操作的东西?

代码语言:javascript
复制
var o = {
    foo: 5,
    handler: function(obj){
        return function() {
            alert(obj.foo);
        };
    }(o); //pointer to o? -----------------------------
};

出于学术上的好奇心,我不打算在生产代码中这样做

intro to the y-combinator

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-16 04:15:31

不,这是不可能的,因为在定义object文本时,变量o是未定义的,并且在定义时的this引用没有引用o

如果您在外部函数中使用了对this的临时引用,并将其传递到闭包中,那么它会起作用,但您将无法传入一个对象来从中获取foo属性。

代码语言:javascript
复制
var o = {
    foo: 5,
    handler:function(){
        var self = this;
        return function() {
            alert(self.foo);
        };
    }
};

var h = o.handler();
h();
票数 1
EN

Stack Overflow用户

发布于 2010-12-16 04:39:44

正如其他人指出的那样,对象文字本身不可能做到这一点。但是,这个过程是可以包装的。它是否“增加了什么”是有争议的。这与Y-Combinator不同(可能只有Y-Combinator的一半?),因为它并没有试图给出一个“递归名称”(据我所知,Y-Combinator假设了一流的函数和闭包或一种模拟此类函数和闭包的方式)。

代码语言:javascript
复制
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上的原型链有一些微妙的问题,如果有的话--这是给读者的练习。

祝你编码愉快。

票数 1
EN

Stack Overflow用户

发布于 2010-12-16 04:16:53

你可以在这里使用this关键字:

代码语言:javascript
复制
var o = {
    foo: 5,
    handler: function() {
      alert(this.foo);
    }
};

这是更简单的方法..。实际上,您的方法甚至是不可能的,因为当您引用o时并没有定义它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4454395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档