国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript中的閉包介紹

2019-11-20 12:55:47
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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()()


Javscript 閉包與讀寫變量
值得注意的是,如果我們沒有處理好我們的變量時,我們也可以修改這些變量。
復制代碼 代碼如下:

function hello(){
    var char = "hello,world";
    return{
        set: function(string){
            return char = string;
        },
        print: function(){
            console.log(char)
        }
    }
}
var say = hello();
say.set('new hello,world')
say.print() // new hello world

Javascript 閉包與性能

引用MDC的說法

復制代碼 代碼如下:

 如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函數中創建函數是不明智的,因為閉包對腳本性能具有負面影響,包括處理速度和內存消耗。

文上還說到。
復制代碼 代碼如下:

 例如,在創建新的對象或者類時,方法通常應該關聯于對象的原型,而不是定義到對象的構造器中。原因是這將導致每次構造器被調用,方法都會被重新賦值一次(也就是說,為每一個對象的創建)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 景德镇市| 普安县| 赣州市| 内江市| 林口县| 定日县| 马鞍山市| 铜鼓县| 历史| 新宁县| 繁昌县| 锡林郭勒盟| 宝应县| 旬邑县| 松原市| 新泰市| 五家渠市| 黄梅县| 泸定县| 庄浪县| 乌兰县| 时尚| 侯马市| 永宁县| 东莞市| 长垣县| 于都县| 米脂县| 玉林市| 修水县| 布尔津县| 融水| 沅江市| 大厂| 黑山县| 庄河市| 秀山| 宣汉县| 自贡市| 长宁县| 临朐县|