Yコビネーターを使用して、この閉鎖のオブジェクト参照を取得できますか?
-
10-10-2019 - |
質問
この閉鎖は機能します:
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? -----------------------------
};
学問的な好奇心から、私は制作コードでこれをやろうとはしていません
解決
いいえ、これは不可能です。なぜなら、オブジェクトのリテラルの定義の時点で、変数は 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
参照しても定義されていません。
所属していません StackOverflow