文档章节

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

JSON_P
 JSON_P
发布于 2016/09/24 23:39
字数 625
阅读 21
收藏 0

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.要解决闭包的什么问题(目标)?

想办法(在外部)访问到函数内部的数据

获取函数内部数据

函数内部的数据,在函数外面访问不到。

函数对其内部的数据有一个保护的作用。

5.利用函数返回值

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.普通的函数返回值说明

两次调用函数,返回的数据并不是同一个数据。
出现这个原因是:函数在每次调用的时候,函数内部的数据会被新创建一次

要解决这个问题, 只需要保证, 函数 foo 只调用一次即可。

7.闭包模型

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)中的数据了。

 

© 著作权归作者所有

JSON_P
粉丝 7
博文 18
码字总数 9688
作品 0
闵行
前端工程师
私信 提问
每个JavaScript工程师都应懂的33个概念

摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:stephentian Fundebug经授权转载,版权归原作者所有...

Fundebug
2018/10/30
0
0
浅谈闭包,原型链,面向对象

闭包: 百度百科: 官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 闭包的特点:   1.作为一个函数变量的一...

尚有
2018/01/11
0
0
JavaScript开发者应懂的33个概念

简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的。它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南。 本篇文章是参照 @leonardomso 创立,英文版项目地址在这里。 ...

大灰狼的小绵羊哥哥
2018/10/22
0
0
深入理解javascript原型和闭包(完结)

说明:   该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分——原型和闭包,当然,肯定少不了原型链...

zh151832
2016/08/02
28
0
简析面向对象中的继承,原型链,闭包之原型链

理解原型链 我理解中的原型链的东西简单的说就是一条链式结构的对象。就是说对象有原型对象,原型对象也是对象,所以,原型对象也有原型对象,这样一环扣一环,就形成了一条链式结构,叫做:...

JSON_P
2016/09/22
37
0

没有更多内容

加载失败,请刷新页面

加载更多

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

https://blog.csdn.net/nugongahou110/article/details/50668925

shzwork
8分钟前
3
0
数据仓库知识积累

1、数据仓库专题(6)-数据仓库、主题域、主题概念与定义 https://blog.csdn.net/hadoopdevelop/article/details/45296981 2、数据仓库基本知识 https://blog.csdn.net/zzq900503/article/de...

sunny小喵
27分钟前
3
0
018、Kubernetes安装前的准备

本次安装采用 Ubuntu Server X64 18.04 LTS 版本安装 kubernetes 集群环境,集群节点为 1 主 2 从模式,此次对虚拟机会有些基本要求,如下: OS:Ubuntu Server X64 18.04 LTS(16.04 版本步...

北岩
30分钟前
2
0
redis 不同数据结构的使用场景?

1. string string 类型也就是 key-value 类型 常用命令:get、set、incr 应用场景:string 是最常用的一种数据类型 2. list 常用命令:lpush,rpush,brpop,blpop 应用场景:作为消息队列,因为...

happywe
43分钟前
6
0
PG jdbc

import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement; public class PG{ public stat......

MtrS
48分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部