JavaScriptの素人レッスン2:ファーストクラスの市民はそれが何を意味して機能していますか?

要約:クールなファーストクラスの市民サウンズ何ですか?

「JavaScriptの単純な」シリーズ

JavaScriptはの歴史についての記事を見た記事:彼が言及したのJavaScriptリファレンスScheme言語は「第一級市民」(第一級オブジェクト)の状況に機能を強化しますが

ファーストクラスの市民ので、名前は非常に大きいが、非常にあいまいに聞こえるということは、これは、翻訳とは何の関係もありませんファーストクラスの市民の多くの人々にも理解できない、私を含めました。

JavaScript関数がファーストクラスの市民で、それが何を意味するのでしょうか?私は、探検議論を開始するためにあなたと一緒に来ます。

ファーストクラスの市民の定義

Wikipediaの概念によると、プログラミング言語は、ファーストクラスの市民が英国のコンピュータ科学者であるクリストファー・ストレイチーは、前世紀の60年代初めの時点で、前方に置く、その時間がありません何のパソコン、ないインターネット、ないブラウザを、持っていませんJavaScriptを。

おそらく、クリストファー・ストレイチーを聞いたことがない私のような人々、多くのを、彼は唯一の厳密な定義せずに、ファーストクラスの市民の概念を提案しました。

ファーストクラスの市民について、私は正式な定義は本から来て見つけ、「プログラミング言語語用論は、」この本は多くの大学の教科書のために設計されたプログラミング言語です。

一般的に、プログラミング言語の値は、それがパラメータとして渡すことができれば第一クラスのステータスを持っていると言われてサブルーチンから返された、または変数に割り当てられます。

換言すれば、プログラミング言語で、戻り値の関数としてのパラメータの関数として第一級市民は、変数に割り当てることができます

たとえば、ほとんどすべてのプログラミング言語での文字列はファーストクラスの市民で、文字列は、関数パラメータとして使用することができ、文字列は、関数の戻り値として使用することができ、文字列は変数に割り当てることができます。

プログラミング言語のさまざまな機能は、必ずしもなどファーストクラスの市民ではないのJava 8の以前のバージョン

JavaScriptが、関数​​は、変数に割り当てることができ、それは関数のパラメータとしてだけでなく、関数の戻り値として使用し、したがってJavaScript関数にすることができる第一級市民です。

関数の引数としての機能

コールバック関数(コールバック)は、非同期JavaScriptプログラミングの基礎である、実際には、それは、関数のパラメータとして機能することです。例えば、我々は、setTimeout関数への最初の引数を使用する機能であります:

setTimeout(function() {
    console.log("Hello, Fundebug!");
}, 1000);

引数、またはコールバック関数としてのJavaScript関数は、非同期を実現するための一つの方法として、我々はすべてのより多くの書き込みが、実際に、それはまた、他のシナリオがあります。

Array.prototype.sort()複雑なデータ構造のいくつかの並べ替えでは、できるカスタム関数を比較する引数として:

var employees = [
    { name: "Liu", age: 21 },
    { name: "Zhang", age: 37 },
    { name: "Wang", age: 45 },
    { name: "Li", age: 30 },
    { name: "zan", age: 55 },
    { name: "Xi", age: 37 }
];

// 员工按照年龄排序
employees.sort(function(a, b) {
    return a.age - b.age;
});

// 员工按照名字排序
employees.sort(function(a, b) {
    var nameA = a.name;
    var nameB = b.name;
    if (nameA < nameB) {
        return -1;
    }
    if (nameA > nameB) {
        return 1;
    }
    return 0;
});

書き込みには、配列要素の大きさとして、大したと思わないが、JavaScriptエンジンは、それがソートAPIを達成するために、データの種類ごとに必要としないので、それだけでソートAPIを実装する必要があり、大幅に節約するためには十分ですユーザーが1以上であると言っている場合は、定義するために使用者に比べてどのように、それはないではありません。

言い換えれば、Array.prototype.sortは()のみ(例えば数や文字列など)の単純なデータの並べ替えを達成することができます場合は、引数として関数を使用することができるので、それは、あまりにも弱いです、それは強力な多くのです。

ところで、Array.prototype.sortを()を達成するために、単純な問題ではない、我々は見ることができV8は、ソートされた配列を達成する方法です

変数に割り当てられている機能

我々は通常、それはこのように書かれている、名前の関数を定義する際にJavaScriptは、無名関数を定義することができます。

function hello() {
    console.log("Hello, Fundebug!");
}

もちろん、あなたも関数を変数に割り当てることができます。

var hello = function() {
    console.log("Hello, Fundebug!");
};

console.log(typeof hello); // 打印 function

これは、タイプこんにちは変数は、「機能」であることを示しています。

他のいくつかのではファーストクラスの関数定義、それも必要です機能はこれもサポートされているJavaScriptで配列やオブジェクトなどの他のデータ構造に保存することができます。

コンピュータサイエンスでは、プログラミング言語は、それが第一級市民としての機能を扱う場合にはファーストクラスの機能を持っていると言われています。これは、言語は、他の関数の引数として関数を渡す他の関数から値としてそれらを返して、変数に割り当てたり、データ構造に格納サポートを意味します。

関数オブジェクトに保存することができ、それは関数は、オブジェクトの方法となっていることを意味します。私はでています簡単に言えレッスン1「はJavaScript:この矢印機能は、まさに地獄のですか?機能はオブジェクトのメソッドとして呼び出されたときに上述においては、この一点やJavaなどのオブジェクト指向言語が一致して、この値の目的です。したがって、JavaScriptのが存在しない場合に、クラスの前に、それがある程度であることはもちろん、比較的弱い、オブジェクト指向プログラミングをサポートしています。

var person = {
    name: "Wang Lei",
    age: 40,
    greeting: function() {
        console.log(`Hello! My Name is ${this.name}.`);
    }
};

console.log(person.age); // 打印 40
person.greeting(); // 打印 Hello! My Name is Wang Lei.

の関数としての関数の戻り値

一般的に言って、関数の戻り値は、数値、文字列、ブールまたはオブジェクトとして、比較的簡単です。JavaScript関数は、最初の市民であるため、私たちは関数内の関数に戻ることができます。

function sayHello(message) {
    return function() {
        console.log(`Hello, ${message}`);
    };
}

var sayHelloToFundebug = sayHello("Fundebug!");
var sayHelloToGoogle = sayHello("Google!");

sayHelloToFundebug(); // 打印Hello, Fundebug!
sayHelloToGoogle(); // 打印Hello, Google!

我々は値sayHelloToFundebug実際に関数を返すのsayHello関数を呼び出すとき、私たちはsayHelloToFundebugを呼び出す必要が関数によって返され、それが印刷情報はに対応し、実行された:「!こんにちは、Fundebug」。

私は、サンプルコードでは、そう書く必要がないので、単純な文言があるため、一部の人々は、この場所を再送します推測します:

function sayHello(message) {
    console.log(`Hello, ${message}`);
}

sayHello("Fundebug!"); // 打印Hello, Fundebug!
sayHello("Google!"); // 打印Hello, Google!

しかし、これはいくつかの複雑な現実的なシナリオでは、関数は、関数は非常に便利です返す、単純な例です。私たちは、以下の簡単な例を与えます。

当社でFundebug マイクロ手紙アプレットプラグインBUGモニタ異なるAPIが異なるファイルに分割を定義されたが、これらのAPIは、ユーザーのなど、いくつかのグローバル・プロパティ、共有する必要があり、カスタマイズ設定をマイクロチャネルアプレットは、ウェブ側の窓の事実があったとしても、何のグローバル変数ウィンドウではありません、おそらくどちらかいけない、グローバルスコープを汚染します。この時間は、どのように行うには?誰もが、定義を見てのために)(fundebug.testそれを定義する方法です。

function defineTestApi(config) {
    function testApi(name, message) {
        const event = {
            type: "test",
            apikey: config.apikey,
            name: name || "Test",
            message: message || "Hello, Fundebug!"
        };
        sendToFundebug(event);
    }
    return testApi;
}

我々は、グローバル・コンフィギュレーション・オブジェクトの設定を共有するdefineTestApi外側の関数を使用する、関数で定義されたtestApi機能が復帰によって返されます。

また、実際に使用があるクロージャを defineTestApi機能の終了が実行されているので、testApi機能はまだdefineTestApi機能を超えた設定変数、そのライフサイクルのconfig変数を使用することができ、。閉鎖の詳細については、私はこのシリーズのフォローアップ記事をご紹介します。

したがって、関数内のリターン機能、または非常に便利

開発者は、そのような閉鎖など、すべての技術的なポイントを、治療謙虚なままにする必要があり、これは無用だとは思わない、それは無用である、実際には、あなただけのシーンのみを使用して満たしていません。この点で、私たちは私のブログで見ることができ、「私の最初の10万+、およびコメントの一部に異議を唱えるの話」

最初の機能は、市民権関数型プログラミングの基礎であります

私が導入した最初の市民の3機能特性は、彼らが何を、その後、JavaScriptをより強力にするのですか?我々はより多くのを参照してくださいJavaScriptのサン作業は、あなたがどんな魔法を感じることはありません。

実際には、最初の関数は市民であり、我々は聞いたことがある関数型プログラミングは密接に関連しています。

ファーストクラスの関数は、高階関数の使用は標準的である関数型プログラミングスタイルのための必需品です。 

つまり、市民の関数は、最初の関数型プログラミングのための必要条件です高次機能、即ち、高次関数、引数として関数を使用することで、それは関数型プログラミングでは非常に一般的です。

関数型プログラミングではなく、私ははっきりと話すことができる単語である何のためとして、あなたは常に血統チューリングマシンに話すことができます。どのように葬儀を知るために、次の時間分解を聞いてください。

JSについては、私はどのような場所、我々はまだはっきりしていないブログのシリーズを書き始めるつもりですか?メッセージを残すことを望むかもしれない、私が見て、そしてあなたと共有することができます。我々はまた、私がいた、私の個人的なマイクロチャネル(KiwenLau)を追加することを歓迎Fundebug JSプログラマの愛憎関係を担当する技術者。

参照

Fundebugについて

Fundebugの JavaScriptの上の焦点は、マイクロチャネル、マイクロチャネルのゲーム、アリペイ小さなプログラム、リアルタイムのオンライン監視BUGネイティブ、Node.jsのとJavaアプリケーションに反応アプレット。2016以来、二から一一が正式に立ち上げ、Fundebugは10億の+エラーイベントの合計を取り扱う、有料顧客はサンシャイン保険、クルミのプログラミング、ライチFM、1対1、マイクロパルスの頭部、青年同盟や他の多くのコミュニティのブランドを持っています。ようこそ無料お試し

IMG

著作権

著者は転載明記してくださいFundebugと紙アドレス:

https://blog.fundebug.com/2019/06/25/javascript-first-class-function/

おすすめ

転載: blog.51cto.com/13957060/2413046