首頁 >web前端 >js教程 >JavaScript中的閉包介紹_javascript技巧

JavaScript中的閉包介紹_javascript技巧

WBOY
WBOY原創
2016-05-16 16:09:151297瀏覽

所謂的閉包應該是指: 內部函數讀取當前函數以外的變量,即創建時所處的上下文環境。

複製程式碼 程式碼如下:

function hello(){
    var char = "hello,world";
    function print(){
        console.log(char);
    };
    return print();
}

要注意的是這裡的print函數引用了外部hello函數的char變量,於是在這裡我們能夠回傳一個
複製程式碼 程式碼如下:

hello,world

而這個功能在某種意義上來說,應該是歸功於作用域。當然了,我們沒有辦法直接存取char,除非是我們宣告這個變數的時候出錯了。如
複製程式碼 程式碼如下:

function hello(){
    char = "hello,world";
    function print(){
        console.log(char);
    };
    return print();
}

只是因為少了個var。

複製程式碼 程式碼如下:

在這裡hello變成一個閉包 了。 閉包是一種特殊的物件。它由兩部分構成:函數,以及創建該函數的環境。環境由閉包創建時在作用域中的任何局部變數組成。

Javscript 閉包與this

要注意的是讀取this與arguments時,可能是會出問題的。

複製程式碼 程式碼如下:

function hello(){
    this.char = "hello,world";
    function output(){
        char = "I'm no hello world";      
        console.log(this.char);
    };
    return output();
}

當然了這個例子並不夠貼切,so,我們需要一個額外的例子來解釋這個問題,以下引用一個《Javascript高級程式設計》中的一個例子,來說明這個問題。
複製程式碼 程式碼如下:

var name = "The window";

var object = {
    name: "My Object",

    getNameFunc: function(){
        return function(){
            return this.name;
        }
    }
};
object.getNameFunc()()


只是這種用用法實在是,而解決方法便是保存一個臨時變數that,如之前在《關於Javascript的this的一些知識》一文中所說的。

複製程式碼 程式碼如下:

var name = "The window";
var object = {
    name: "My Object",

    getNameFunc: function(){
        var that = this;
        return function(){
            return that.name;
        }
    }
};
object.getNameFunc()()


JavaScript クロージャーと変数の読み取りと書き込み
変数を適切に処理しない場合、これらの変数も変更される可能性があることに注意してください。
コードをコピー コードは次のとおりです:

関数 hello(){
var char = "hello,world";
戻る{
set: function(string){
return char = string;
}、
print: function(){
console.log(char)
}
}
}
var Say = hello();
Say.set('新しい hello,world')
Say.print() // 新しい Hello World

JavaScript のクロージャーとパフォーマンス

MDC からの引用

コードをコピー コードは次のとおりです:

特定のタスクにクロージャが必要ない場合、他の関数内に不必要に関数を作成するのは賢明ではありません。クロージャは、処理速度やメモリ消費量などのスクリプトのパフォーマンスに悪影響を与えるからです。

記事でも言及されていました。
コードをコピー コードは次のとおりです:

たとえば、新しいオブジェクトまたはクラスを作成する場合、メソッドは通常、オブジェクトのコンストラクターで定義されるのではなく、オブジェクトのプロトタイプに関連付けられる必要があります。その理由は、これにより、コンストラクターが呼び出されるたびに (つまり、オブジェクトが作成されるたびに) メソッドが再割り当てされるためです。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn