简析面向对象中的继承,原型链,闭包之闭包

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)中的数据了。
相关文章
相关标签/搜索