Yコビネーターを使用して、この閉鎖のオブジェクト参照を取得できますか?

StackOverflow https://stackoverflow.com/questions/4454395

質問

この閉鎖は機能します:

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コビネーターと同じではありません(おそらくその半分?)。「再帰的な名前」を与えようとしていないためです(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