簡析面向對象中的繼承,原型鏈,閉包之閉包

1.理解閉包咱們首先要了解做用域的問題,簡單瞭解一下做用域,以下做用域的一些結論:閉包

1 函數纔會造成做用域
2 JavaScript的做用域是詞法做用域
3 詞法做用域:變量(變量和函數)的做用範圍 在代碼寫出來的就已經決定, 與運行時無關
4 函數內部能夠訪問函數外部的變量(函數外部不能訪問函數內部的變量)
5 變量搜索原則:從當前鏈開始查找直到0級鏈,從高到低查找

當定義了一個函數,當前的做用域鏈就保存起來,而且成爲函數的內部狀態的一部分。

2. 閉包的概念

閉包從字面上看就是封閉和包裹, 在函數中定義的變量在函數外部沒法訪問, 所以這個函數就構成閉包。

> 閉包是一個受保護的變量空間。

閉包包括:函數 以及 建立該函數的環境(做用域鏈)

3.閉包代碼搶先看:函數

function foo() {
    var num = 0;

    return function() {
        return num++;
    };}

var getNum = foo();console.log(getNum());

4.要解決閉包的什麼問題(目標)?spa

想辦法(在外部)訪問到函數內部的數據對象

獲取函數內部數據ip

函數內部的數據,在函數外面訪問不到。作用域

函數對其內部的數據有一個保護的做用。get

5.利用函數返回值io

function foo() {
    var num = 123;
    return num;}

var num1 = foo();
  • 疑問:獲取兩次數據是同一個數據嗎? 不是同一個數據
var num1 = foo();var num2 = foo();console.log(num1 === num2); // true
  • 返回對象的狀況
function foo() {
    var obj = {num: 123};
    return obj;}

var o1 = foo();var o2 = foo();console.log(o1 === o2); // false

6.普通的函數返回值說明console

兩次調用函數,返回的數據並非同一個數據。
出現這個緣由是:函數在每次調用的時候,函數內部的數據會被新建立一次

要解決這個問題, 只須要保證, 函數 foo 只調用一次便可。

7.閉包模型function

function foo() {
    var str = "BOSS";

    return function() {
        return str;
    };}

// 調用var f = foo();var str1 = f();var str2 = f();console.log(str1 === str2);
  • 閉包說明:
在函數(outer)內部定義的函數(inner),執行的時候能夠訪問到上一級做用域中的變量。
所以,在函數(outer)外部,就能夠間接訪問到函數(outer)中的數據了。
相關文章
相關標籤/搜索