闭包

function outter(){
var a = 1;
function inner(){
console.log(a);
}
return inner;
}
//进行函数调用
var inner = outter();
inner();

以上代码是最基本的闭包的形成.当outter函数开始调用的时候,它内部就形成了一个闭包,这个闭包存在使用了outter函数的a变量的inner函数的作用域中.所以当inner函数调用的时候,才能够仍然访问到outter函数的a变量.

所以可以看到闭包的一些特性.

闭包的形成:当外部函数的执行上下文被启动的时候,或者说是外部函数被调用的时候

闭包的位置: 闭包存放在内部函数的作用域中,名称为closure.

闭包的作用:能够让内部函数在外依然能够访问到外部函数的变量,延长了该变量的生命周期.

闭包的形成条件: 函数内里嵌套函数,并且内函数使用到了外部函数的变量.

闭包的释放: 闭包不会主动销毁,会造成轻微的内存泄露.可以自己选择主动的对内部方法进行释放,置为null.

那么闭包在JS中有何作用,我觉得闭包很大的作用在于弥补了JS语言的一些数据私密性的缺陷.

在JS中,没有类的概念,一切以函数为尊.而函数内部的一些属性和方法保证了一些权限,不可访问.那么这个时候闭包的作用就显现出来的.有点相当于其他语言中,构造了一些私有的属性和方法,然后提供了一个公开的接口以供访问调用,然后可以保证一些安全性.

在JS中,通过提供返回的一个函数内部方法,暴露一些可以公开的变量或者方法让人进行访问.

function Person(){
var name = "Jan";
// 名字可以公开,但是年纪不能公开
var age = 18;
function about(){
console.log('我的名字是'+this.name);
}
return about;
}

常见的闭包

  1. 将函数作为另一个函数的返回值
  2. 将函数作为实参传递给另一个函数调用

闭包相关面试题

function fun(n, o) {
console.log(o)
return {
fun: function (m) {
return fun(m, n)
}
}
}
var a = fun(0)
a.fun(1) // -- var b = fun(1,0)
a.fun(2) // var c = fun(2,0);
a.fun(3) // var d = fun(3,0)
// undefined,0,0,0 var b = fun(0).fun(1).fun(2).fun(3) //undefined,0,1,2 var c = fun(0).fun(1)
c.fun(2)
c.fun(3) //undefined,0,1,1

Web | JavaScript的闭包的更多相关文章

  1. JavaScript之闭包

    JavaScript之闭包 在JavaScript中,闭包恐怕是很多人不能理解的一个概念了,甚至很多人也会把闭包和匿名函数混淆. 闭包是有权访问另一个函数作用域中的变量的函数.首先要明白的就是,闭包是 ...

  2. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  3. JavaScript作用域闭包简述

    JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...

  4. JavaScript的闭包原理

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

  5. Js(javaScript)的闭包原理

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

  6. 深入理解javascript的闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  7. 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  8. javascript,jquery(闭包概念)(转)

    偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...

  9. 理解Javascript 的闭包(closure)

    要理解闭包的概念先从变量的作用域说去 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之 ...

随机推荐

  1. laravel开发之-composer安装(windows)

    1 在https://getcomposer.org/download/中下载composer.exe 2 选择php.exe安装composer 3 cmd命令框中输入composer.查看是否安装 ...

  2. git基础命令。

    创建一个新的本地仓库    git init 克隆远程服务器    git clone URL 打开一个文件夹   cd 添加文件   git add . 本地提交更改   git commit -m ...

  3. moveTaskToback退后台的用法及作用

    1 方法:public boolean moveTaskToBack(boolean nonRoot) activity里有这个方法,参数说明如下: nonRoot=false→ 仅当activity ...

  4. MooseFS安装部署

    环境信息 Master服务器 dev04 chunkserver服务器 dev02.dev03.dev04 metalogger服务器 dev03 mount客户端 dev01.dev02 安装前下载 ...

  5. Taro 是一套遵

    https://github.com/NervJS/taro 使用 Taro,我们可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信小程序.H5.React-Nat ...

  6. python 3 过滤股票

    参考某个博客,代码不全,地址找不到了见谅,加了些自己弄的算法. 备忘 #-*- coding: utf-8 -*-import os, reimport time def filefilter(com ...

  7. vs安装部署“必备”组件里面正常情况没有出现office2010 PIA组件

    vs安装部署“必备”组件里面正常情况没有出现office2010 pia组件时,将 Office2010PIARedist 文件夹放在C:\Program Files\Microsoft SDKs\W ...

  8. Java学习---程序设计_面试题[2]

    百度2017春招笔试真题编程题集合之买帽子 // 2017-10-09 // 题目描述 // 度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同.度度熊想买一顶价格第三便宜的帽子,问第 ...

  9. 四种Timer的区别和用法

    1.System.Threading.Timer 线程计时器 1.最底层.轻量级的计时器.基于线程池实现的,工作在辅助线程. 2.它并不是内在线程安全的,并且使用起来比其他计时器更麻烦.此计时器通常不 ...

  10. HDFS Namenode&Datanode

    HDFS Namenode&Datanode HDFS 机制粗略示意图 客户端写入文件流程: NN && DN Namenode(NN)工作机制 NN是整个文件系统的管理节点. ...