1

関数自体内の関数にプロパティを割り当てられるようにしたい。呼び出しのオブジェクトに割り当てたくありません。だから私はこれを行うのと同等のことをしたい:

var test  = function() {                    
    return true;         
};

test.a = 'property on a function';
alert(test.a);

これの代わりに、プロパティがグローバル オブジェクトに割り当てられます。

var testAgain = function() {
   this.a = "this property won't be assigned to the function";

   return true;  
};

testAgain();
alert(window.a);

編集:明確にするために、次のようなものがあるかどうか疑問に思っています:

var test = function() {
   function.a = 'property on a function';
};
alert(test.a); // returns 'property on a function'

関数が test と呼ばれることを知らずに、または実行する必要がありません。もちろん、これが有効な構文ではないことは知っています

4

4 に答える 4

3

[関数にプロパティを設定する方法はありますか]関数が呼び出されていることや、関数test を実行する必要があることを知らなくても。

強調鉱山。

グローバル変数名が必然的にどうなるかを知らなくても、関数にプロパティを設定できますが、何らかの方法で関数への参照が必要です。

モジュールパターンは、私が考えることができる限りぴったりです。

window.test = (function () {
    //the function could be named anything...
    function testFn() {
        ...code here...
    }
    //...so long as the same name is used here
    testFn.foo = 'bar';
    return testFn;
}());
window.test.foo; //'bar'

外側のクロージャーはtestFn、グローバルにどこからでもアクセスできないようにするため、他のすべての参照はを使用する必要がありますwindow.test


回答のこの部分は、以前のバージョンの質問に関連付けられています。

これを行う最も簡単な方法は、名前付き関数を使用することです。

var test = function testFn() {
    testFn.foo = 'bar';
    return true;
};

test.foo; //undefined
test();
test.foo; //'bar'

これを行うためのより良い方法は、モジュールパターンを使用して、グローバルリークに関する問題を誤って作成しないようにすることです。

var test = (function () {
    function ret() {
        ret.foo = 'bar';
        return true;
    }
    return ret;
}());

test.foo; //undefined
test();
test.foo; //'bar'
于 2012-08-29T18:40:22.967 に答える
1
var testAgain = function() {
    arguments.callee.a = "this property won't be assigned to the function";
    return true;  
};

testAgain();
alert(testAgain.a);​
于 2012-08-29T18:41:25.320 に答える
0

これは、名前を使用して次のようにプロパティを割り当てるだけで簡単に実行できます。

var test = function () {
    test.a = 'a';
    return true;
};

test呼び出されると、プロパティが設定されます。

デモ

前述のように を使用できますが、それは本当に悪い習慣と見なされます。また、厳密モードでは機能しません。arguments.calleesu-

于 2012-08-29T18:42:00.940 に答える
0
var test = function() {
    test.a = 'a';
};

または、プロトタイプを使用することもできます。詳細については、こちらを参照してください。

于 2012-08-29T20:54:22.730 に答える