首页 技术 正文
技术 2022年11月8日
0 收藏 697 点赞 1,248 浏览 828 个字

简单认识闭包

  前言:和大多数编程语言一样,js也采用词法作用域,即函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。函数对象可以通过作用域链关联起来,函数体内部的变量都可以保持在函数作用域内,这种特性在计算机文献中被称之为闭包(含义是指函数变量可以被隐藏于作用域链之内,因此看起来函数将变量包裹起来了)。


首先我们先来看一段代码:

var scope = 'global scope'  //全局变量
function checkScope(){
var scope = 'local scope';//局部变量
function f(){ //嵌套函数
console.log(scope);
};
return f() //返回f执行结果
};
checkScope(); //运行结果 local scope;

  这段代码很容易看懂,在调用checkScope的时候,该函数内部把f的运行结果返回;

  下面我们把上面的代码稍加改造:

var scope = 'global scope'  //全局变量
function checkScope(){
var scope = 'local scope';//局部变量
function f(){ //嵌套函数
console.log(scope);
};
return f //返回f执行结果
};
checkScope()(); //运行结果 local scope;

  现在在调用checkScope的时候返回的仅仅是一个函数对象,此时在checkScope外部调用这个函数对象,那么他里面的返回结果还是local scope而不是global scope;

  原理:js的执行用到了作用域链,这个作用域链是在函数定义时创建的。嵌套函数f定义在这个作用域链里,其中的scope一定是局部变量,不管任何时候执行f,这种绑定在执行f的时候依然有效。(闭包的这种特性强大到让人吃惊,它们可以捕捉到局部变量(和参数),并一直保存下来)。


加入QQ群,和更多同道中人一起happy吧!!!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,216
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,673
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,507
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,278
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,924
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,082