5

私はかなり前からWebのプログラミングを行ってきましたが、関数の使用と、関数を使用して実行できる奇妙な(または私がそれらを見る)ことに関して、いくつかの新しい複雑さを発見したのはつい最近のことです。ただし、現時点では、構文的にはきれいなものにすぎないようです。私は、これらの新しく発見された側面のいくつかがどのように役立つかについて誰かが私に教えてくれることを望んでいました。

たとえば、これを初めて実行したときは、確実に機能しないと思いました。

<script>
function x(q)
 {
q(x);
 }

x(function(a)
 {
alert(a);
 }
 );
</script>

しかし、それはしました!どういうわけか、唯一のパラメーターとして別の無名関数を受け取り、パラメーターとして渡された関数を実行する名前付き関数を作成すると、問題なく機能します。これは前向きに私の心を吹き飛ばし、それにはかなりの実用性があるとほぼ確信していますが、私はまだそれを完全に配置することはできません。

ああ、そして私が発見したもう1つのことは、グローバルスコープの変数を使用して関数を格納し、後でJavaScriptのeval()関数を使用してその変数を変更し、関数の内部動作を動的に変更できることです。例:

<script>
var f = function()
 {
alert('old text');
 }

eval('f = ' + f.toString().replace('old text', 'new text'));

f();
</script>

案の定、そのコードは「新しいテキスト」文字列に警告します。それを見たとき、私の心は再び吹き飛ばされましたが、信じられないほどの何かを生み出す可能性についてもすぐに興味をそそられました。

だから...スタックオーバーフローについての私の燃える質問:そのような一見抽象的なコーディングの原則をどのように前向きな方法で使用することができますか?

4

3 に答える 3

5

基本的に質問しているのは、関数をファーストクラスのオブジェクトとして使用するにはどうすればよいですか?

最大かつ最も一般的な使用法は、イベント処理のクロージャ(または無名関数)です。しかし、あなたが賢いことができるという理由だけで、それはあなたがそうするべきであるという意味ではありません。他の言語と同じように、明確で読みやすいコードを記述します。

ああ、そしてevalを入力するためにむち打ちをして、二度とそれをすることを考えないでください

于 2009-01-26T20:30:32.367 に答える
3

最初のクロージャは、JavaScriptでは非常に一般的です。より高度な例が必要な場合は、http: //ejohn.org/apps/learn/をいじることができる素敵なインタラクティブな遊び場があります。

window.onloadこれが、私が取り組んでいるものが本格的なライブラリを必要としないときに使用する私の関数です。

//add events to occur on page load
window.addOnload = function(fn) {
    if (window.onload) {
        var old = window.onload;
        window.onload = function() {
            old();
            fn();
        }
    } else {
        window.onload = fn;
    }
}

そうすれば、オンロードで何かが発生する必要があるときはいつでも、匿名関数を使用できます。これが私の最近のメンテナンスプロジェクトの例です。

//make all menu items have a hover property
window.addOnload(function(){
    var cells = document.getElementsByTagName('td');

    for (var i=0; i < cells.length; i++) {
        if (cells[i].className != 'NavMenuItem')        continue;

        (function(cell){
            cell.onmouseover = function() {
                cell.className = 'NavMenuItemHighlight';
            }
            cell.onmouseout = function() {
                cell.className = 'NavMenuItem';
            }
        })(cells[i])
    }
});

2回目の「発見」については、知らなかったふりをしてください。

于 2009-01-26T20:31:05.580 に答える
0

最初のものは通常、停止問題が決定不能であることを証明する方法です...

「役に立つ」と考えるかどうかは、完全にあなた次第だと思います B-)

于 2009-01-26T20:35:39.673 に答える