1

私はしばらく疑問に思っていました - JavaScript クロージャーは何に使用できますか?

私はそれらを書く方法とそれらがどのように機能するかを知っていますが、それらがどのように使用できるかについてのアイデアを得ることができません.

function closure() {
  var name = "John";
  function displayName() {
    return 'Hello, ' + name;
  }
  return displayName;
}

これまでのところ、それらの使用法は 1 つしか見つかりませんでした。つまり、データをカプセル化するため、関数の外では見えません。

しかし、それらは他に何に使用できますか? クロージャを使って OOP を書くべきですか? グローバルスコープを台無しにしないように、すべてのコードをクロージャー内に配置する必要がありますか?

明確化は大歓迎です!

4

2 に答える 2

1

また、colsure 内のコードを、クロージャ外の異なるライブラリ間の名前の競合から保護するためにも使用できます。Ex JQuery プラグインを作成するたびに、In "JQuery" を渡す自己呼び出しクロージャーとして作成しますが、関数定義の名前付き $ 変数のローカル スコープにより、クロージャー内の $ を安全に参照できます。別の目的で $ 変数を使用する他のライブラリがある場合でも

(function($){ //use $ safely inside the closure })
(jQuery);
于 2013-03-28T04:00:38.033 に答える
1

個人的には、カプセル化やプライベート コンテキストの作成などの明白なことの他に、Singleton JavaScript Design Pattern が好きです。

function Singleton() {
    // cached instance
    var instance = this;

    //proceed as normal - adding some variables
    this.variable1 = 1000;
    this.variable2 = 3000000;

    Singleton = function() {
        return instance;
    }
}

var singleton1 = new Singleton();
var singleton2 = new Singleton();

if(singleton1 === singleton2) {
    console.log("Singleton works :)");
}
else {
    console.log("Singleton doesn't work :/");
}

このコードを Chrome JavaScript コンソールに直接貼り付けることができます。

もちろん、ニーズに合わせて微調整することもできます。また、いくつかの欠点もあります。Singleton 関数を上書きでき、インスタンスにアクセスできなくなります。しかし、これは別の問題です。

Stoyan Stefanov (O'Reilly) による JavaScript Patterns book でずっと前に見つけました。他にも有用な設計パターンやクロージャーの適用例があるので、こちらをチェックしてください。この本によると:

You can use closure to store some private data, which is accessible by the returned function but not to the outside code.
于 2013-03-28T04:07:27.963 に答える