理解Js的闭包,首先让我们先看几个概念

执行环境(executive environment)每个函数都有自己的执行环境,匿名函数默认为全局环境。

作用域链(scope chain)子函数继承父函数,但是父函数不能引用子函数。

变量对象(variable object)分为全局变量对象,和局部变量对象,前者的生存在整个环境中,后者在生存在函数的执行环境下,就是说,执行函数时被创建,当函数执行完后被销毁。

怎么被销毁的啊?目前最常见的算法是当变量对象不再被引用时,便可回收内存。

但是,若是想在函数外部访问函数内部的变量,就要用的闭包。

例如下面的程序:

var cat = "Hello Kitty";

function findCat(){
var cat = "Garfield"
var dog = "Odie"
return function(){
return alert(cat);
}
} var myCat = findCat();
myCat(); //Garfield

我们在函数外部访问到了,函数里面的变量“Garfield”

匿名函数为findCat()内部函数,继承其作用域链,能够找到变量cat。

作用域链:(优先级从0开始)

  2        全局环境

变量对象: cat = “Hello Kitty”

  1       findCat()环境

变量对象:cat = “Garfield”

  0       匿名函数

变量对象:无

变量对象不是在函数findCat执行完就已经被敲毁了嘛?

但是,我们在执行完findCat后,只是销毁了作用域链,(作用域链就是一个指向变量对象的指针),当活动对象被引用的次数为0就会被销毁,但是不要忘了,我们的匿名函数继承了父函数的作用域链,在闭包中,cat这个变量对象,仍然在被引用,所以不会被销毁。

浅谈对Js闭包的理解的更多相关文章

  1. 浅谈对js原型的理解

    一.  在JavaScript中,一切皆对象,每个对象都有一个原型对象(prototype),而指向该原型对象的内部指针则是__proto__.当我们对对象进行for in 或者for of遍历时,就 ...

  2. 浅谈Vue.js

    作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...

  3. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...

  4. 个人对js闭包的理解

      闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法 ...

  5. 【闭包】JS闭包深入理解

    先看题目代码: 1 2 3 4 5 6 7 8 9 10 11 12 function fun(n,o) {  console.log(o)  return {   fun:function(m){ ...

  6. 从循环添加事件谈起对JS闭包的理解

    1.引子 相信很多初学js的人,都遇到这样一种情况:想要给一堆按钮添加各自的事件,比如点击第i个按钮时,弹出i这个值.理所当然地,我们会这样写: var buttons = document.getE ...

  7. 闲聊——浅谈前端js模块化演变

    function时代 前端这几年发展太快了,我学习的速度都跟不上演变的速度了(门派太多了,后台都是大牛公司支撑类似于facebook的react.google的angular,angular的1.0还 ...

  8. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

  9. js 闭包原理理解

    问题?什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 很显然 ...

随机推荐

  1. Mysql 5.7 Linux安装详细步骤

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下载安装包 http://dev.mysql.com/downloads/mysql/#downloads 推荐下载通用安装方法的TAR包(h ...

  2. ssh 配置config 别名

    打开shell 当前用户 cd ~ cd .ssh vim config Host (别名) User root(git)   登陆远程shell的用户 HostName 10.0.0.1 ip地址 ...

  3. 3.vi 和软件安装

    vi编辑器全屏幕纯文本编辑器1.软件开发(程序编写) 2.配置文件修改以及系统服务调用模式 命令模式 插入模式 末行模式 a  追加    i 插入   o  打开(下一行) ESC shift+: ...

  4. Angular--页面间切换及传值的四种方法

    1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个produce ...

  5. pure virtual function call

    2015-04-08 10:58:19 基类中定义了纯虚函数,派生类中将其实现. 如果在基类的构造函数或者析构函数中调用了改纯虚函数, 则会出现R6205 Error: pure virtual fu ...

  6. Boost学习笔记(三) progress_timer

    progress_timer也是一个计时器,它继承自timer,会在析构时自动输出时间,省去timer手动调用elapsed()的工作,是一个用于自动计时相当方便的小工具. #include < ...

  7. CentOS搭建NodeJS环境

    事件驱动,承受高并发……这些耀眼的光环,使前端开发者不能不去学习NodeJS. 今天就在开发环境把NodeJS搭建起来了. 1. 下载node wget http://nodejs.org/dist/ ...

  8. DOCTYPE声明作用及用法详解

    一.浏览器呈现模式和doctype 有的网页是遵循标准而创作的,但也有很多不是.即使你不能创建遵循标准的网页,也希望浏览器根据标准来正确显示那些页.目前,大量网页充斥着大量非标准代码,它们仍能正常地工 ...

  9. target与currentTarget区别 ( html是弹窗居中的例子)

    <!DOCTYPE html> <html> <head> <title></title> <style type="tex ...

  10. iOS - Safe iOS 加密安全

    1.Base64 编码 简介: Base64 是一种基于64个可打印字符来表示二进制数据的表示方法,可打印字符包括字母 A-Z.a-z.0-9,共 62 个字符,另外两个符号在不同的系统不同 +,/. ...