-2

家でJavascriptzをプレイしているときに、何かに直面しました...

文字列から各文字を返すか、配列から各位置の値を返す単純な関数を作成しました。

function each (haystack, callback) {
    var each;
    for (each in haystack){
        if (callback && typeof callback == "function") {
            callback (haystack[each]);
        }
    }
}

使い方:

each ("StackOverflow", function (c) {
    console.log(c);
});

/\それをこれに変える方法があるかどうか疑問に思いました:

each ("StackOverflow", c) {
    console.log(c);
}

または、少なくともこのようなfunctionもの、コールバックの単語を書き直す必要がないもの。

私はこれを試しましたが、成功しませんでした:

each ("StackOverflow",
    "console.log(c)" // turn the callback function into a string
    // but where was `c` defined here? do.not.ask.me.
);

そして、each()だった:

function each (haystack, callback) {
    var each;
    for (each in haystack){
        // call it in a setTimeout() crazy? yeah, didn't work...
        setTimeout(callback, 0);

        //and also tried this, no success...
        var b = new Function ("haystack[each]", cb);
        b ();
    }
}

ここでの私の結論は、残念ながら、無名関数を宣言せずにコールバック関数を持つことはできないということです。

作品を使わずにコールバック関数を作る方法はあります functionか?

4

5 に答える 5

4

文字列表現バージョンを忘れてください、それは常にeval()、私たちが悪であると知っているを含みます。

プログラミング言語の構文を単純に変更することはできません。

とにかく書くfunction () {}ことは実際には大きな迷惑ではありません。スニペットを自動的に挿入するようにエディターを構成することもできます。また、CoffeeScriptを使用することもできます。これは、関数の構文が簡単で(もちろん、他のいくつかの機能を除く)、Javascriptにコンパイルされます。

また、無名関数を使用する必要はありません。あらゆる種類の関数を渡すことができます。

var func = function (x) { console.log(x); }; //inline function
each ("StackOverflow", func);

function func2 (x) { console.log(x); }; //classic function
each ("StackOverflow", func2);

each ("StackOverflow", alert); //YEEEES

each ("StackOverflow", 
    console.log.bind(console)); //here you should bind it to console!
于 2012-12-21T01:35:44.470 に答える
3
for (each in haystack)

配列であることが期待haystackされる場合は、forループでキーを列挙するのではなく、forループで反復する必要があります(違いについては、 JavaScript for ... inとforを参照してください)。これは、文字列を繰り返す場合に特に当てはまります。古いIEは、文字列の角かっこ表記をサポートしていないことに注意してください。

匿名関数を宣言せずにコールバック関数を持つことはできません

いいえ。コールバック関数の場合、もちろん、いくつかの関数が必要です。ただし、必ずしも無名関数式である必要はありません。あなたの例では、あなたはただすることができます

each ("StackOverflow", console.log);
each ("StackOverflow", console.log.bind(console)); // for Chrome users

…または他の場所で宣言した他の適切な関数を渡します。

文字列(このライブラリのように)はさらに短い場合もありますが、編集する必要がありますeval。これはこの目的には悪です。残念ながら、EcmaScriptは短いラムダ式をサポートしていませんが、FFのみのJavaScript1.8式クロージャまたはCoffeeScriptのミニマリスト関数構文を確認することをお勧めします。

于 2012-12-21T01:37:59.467 に答える
3

ECMAScriptで関数を作成するには、正確に2つの4つの方法があります。

  1. FunctionDeclaration _
  2. FunctionExpression _
  3. 関数として呼び出される関数コンストラクター
  4. コンストラクターと呼ばれる関数コンストラクター

すべて、文字列「function」または「Function」を使用する必要があります。

于 2012-12-21T01:39:27.620 に答える
2

簡単な答え:いいえ。

匿名関数の構文が短いCoffeescriptのようなjavascriptへのコンパイル言語を採用できます。

//javascript version
function(c){ console.log(c) }

//coffeescript version
(c) => console.log c

それ以外の場合は、関数をどこかで宣言する必要があります。それは「インプレース」(無名関数)であるか、コード内のどこかで変数として宣言する必要があります。

于 2012-12-21T01:40:40.320 に答える
2

コールバックとして直接使用するには、少なくともChromeでは正しい実行コンテキストが失われないようconsole.logに、必ずバインドして戻す必要があります。console

each([1, 2, 3], console.log.bind(console));

また、あなたeach()はそれで安全に動作しませんfor ... in

for (var i = 0, n = haystack.length; i != n; ++i) {
    callback(haystack[i]);
}

オブジェクトに追加のプロパティが追加されている場合、違いはより明白になりArrayます。

参照:配列の反復で「for ... in」を使用するのはなぜ悪い考えですか?

于 2012-12-21T01:41:34.013 に答える