6

これは無名関数で実行できることを知っています

(function toBeExecutedImmediately() {
    // Code
}());

他の場所で使用したい関数がありますが、すぐに実行する必要があります。次の代わりに1つのステートメントでそれを行うことは可能ですか? 戻り値は必要ありません。

function toBeExecutedImmediately() {
    // Code
};

toBeExecutedImmediately();
4

3 に答える 3

4

次の代わりに1つのステートメントでそれを行うことは可能ですか?

いいえ、あなたが見つけたように、名前付き関数式(あなたの最初の例)は名前を含むスコープに名前を追加しません(壊れたエンジンを除いて - 私はあなた、IE8以前を見ています)。それを可能にするために何もせずに関数を他の場所で呼び出します。もちろん、関数宣言(2番目の例)では、名前を2回指定する必要があります。

あなたの最善の策は、おそらく先に進んで宣言と個別の呼び出しを行うことです(2番目の例)。

「単一のステートメント」の定義を技術的に満たす複雑なものを考え出すことはおそらく可能ですが、それよりも短くなる可能性は低いです。

簡潔にすることが目標である場合、これは 2 つのステートメントですが、簡単に説明します。

var f = function() {
    // Code
}, toBeExecutedImmediately = f;
f();

しかし、比較的簡潔ではありますが、明快さが損なわれていると思います。:-)

もちろん、ヘルパー関数を追加すれば何でも可能です。例えば:

// The helper
function defineAndExecute(f) {
    f();
    return f;
}

// using it
var toBeExecutedImmediately = defineAndExecute(function() {
    // Do work here
});

この関数は技術的に匿名ですが、var. (ここでも名前付きの関数式を使用できますが、もちろん、名前を繰り返さないという目標を達成することはできません。私の理解ではそうです。)


サイドノート:最初の例は「無名関数」ではありません。関数には適切な名前があり、名前付きの関数式です。関数宣言とは異なり、名前付き関数式では、その名前が含まれるスコープに追加されないだけです。

于 2013-11-03T11:21:38.640 に答える
2

名前空間を使用できます:

// alerts "say yes"
(window.say = function (s) { alert('say ' + s); })('yes');
// alerts "say something"
say('something');

コメントへの返信として、関数を local にする方法は次のとおりです。

(function(){
    var dontSay;
    // alerts "don't say no"
    (dontSay = function (s) { alert('don\'t say ' + s); })('no'); 
    // alerts "don't say anything"
    dontSay('anything');
})();

@JoeSimmonsそれは確かに革命ではありませんが、質問も本当に本質的ではありません;D

于 2013-11-03T11:34:30.887 に答える
1

次のような「関数ビルダー」のようなものを書くことができます。

function DeclareAndExecute(name, func) {
    window[name] = func;
    func();
}

使用法:

DeclareAndExecute("toBeExecutedImmediately", function() {
    //code here
});

ライブ テスト ケース

windowこれにより、指定された名前を使用して関数がグローバル スコープに追加され、 insta-execute が実行されます。

于 2013-11-03T11:25:41.657 に答える