3

事実

Function('return this')()常にグローバル(ウィンドウ)オブジェクトを返します。Function.bind({})('return this')()グローバルオブジェクトも返します。

私の目標

のバリエーションを作成したいFunction。そのバリエーションを呼び出すことによって返される無名関数は、Function常にmyObjとして使用する必要がありますthis

JavaScriptがその特別な方法で動作しない場合(「事実」を参照)、次のようにします。

var myFun = Function.bind(myObj);

myFun私が所有したいオブジェクトです。これで、次のことができるようになります。

console.assert(myObj === myFun('return this')());

私の質問

  • 別のオブジェクトに送信した後でも、なぜFunction戻るのですか?global.bind()
  • 回避策はありますか?Function別のオブジェクトにバインドするにはどうすればよいですか?

ありがとう。

4

2 に答える 2

1

あなたは本質的にこれをやっています:

Function.call({}, 'return this;')();

このFunction関数は、新しい匿名オブジェクトのコンテキストで実行されます。これを行っても、によって生成される関数のコンテキストには影響しませんFunction。どのコンテキストで実行されFunctionているかは関係ありません。常にデフォルトのグローバルコンテキストを持つ関数を生成します。

によって生成される関数のコンテキストを指定する場合は、次のようFunctionにラップします。Function

// give our vars privacy in a closure
(function() {
    // store old Function
    var oldFunc = Function;

    // redefine Function to be a wrapper around the real Function
    // which takes an additional `context` argument
    Function = function(ftext, context) {
        return oldFunc(ftext).bind(context);
    }
}());

これで、電話をかけることができFunction('return this', myObj)();、が返されmyObjます。


または、テストに合格する提案されmyFun(text)た構文を単純に作成するには、次のようにします。assert

var myFun = function(ftext) {
    return Function(ftext).bind(myObj);
}
于 2012-08-13T16:48:15.057 に答える
0

何を達成しようとしているのか正確にはわかりませんが、メソッドチェーンの順序が間違っているようです。

Function('return this').bind({})() // returns the empty Object
于 2012-08-13T09:14:36.343 に答える