博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript闭包的个人理解
阅读量:7230 次
发布时间:2019-06-29

本文共 907 字,大约阅读时间需要 3 分钟。

hot3.png

1、在函数内部声明变量的时候一定要用var命令。如果不用的话,实际上声明了一个全局变量。

2、在JS中,对于变量,就是内部函数可以一直向上寻找父对象变量,内部函数可以访问父函数定义的变量,但父函数不能访问子函数变量。最简单的理解就是儿子可以要父亲的,父亲要不了儿子的。

3、闭包就是为了解决上述问题的,将子函数作为父函数的返回值,这样就可以在外部读取内部变量了。

function f1(){

    var n=999;

    nAdd=function(){n+=1}

    function f2(){

      alert(n);

    }

    return f2;

}

var result=f1();

result(); // 999

nAdd();

result(); // 1000

在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

4、函数体内部用var关键字定义变量,会对变量有个保护作用,这个保护的作用域限定在这个函数体内,也就是说,在这个函数体内访问这个变量,是这个值,如果没有var关键字,则定义并改变了变量的值。

function outerFun(){

var a =0;

alert(a); 

}

var a=4;

outerFun();

alert(a);

结果是 0,4 . 因为在函数内部使用了var关键字维护a的作用域在outFun()内部. 

再看下面的代码: 

Js代码 

function outerFun(){

//没有var 

a =0;

alert(a); 

}

var a=4;

outerFun();

alert(a);

结果为 0,0 真是奇怪,为什么呢? 

作用域链是描述一种路径的术语,沿着该路径可以确定变量的值.当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4; 并改变其值.

转载于:https://my.oschina.net/u/1186749/blog/616621

你可能感兴趣的文章
mongodb--安装和初步使用教程
查看>>
ES6简单总结(搭配简单的讲解和小案例)
查看>>
text-decoration与color属性
查看>>
如何使用Mybatis第三方插件--PageHelper实现分页操作
查看>>
PyCharm搭建GO开发环境(GO语言学习第1课)
查看>>
Android交互
查看>>
提醒我喝水chrome插件开发指南
查看>>
列表数据转树形数据
查看>>
Java新版本的开发已正式进入轨道,版本号18.3
查看>>
从零开始的webpack生活-0x009:FilesLoader装载文件
查看>>
在electron中实现跨域请求,无需更改服务器端设置
查看>>
gitlab-ci配置详解(一)
查看>>
听说你叫Java(二)–Servlet请求
查看>>
案例分享〡三拾众筹持续交付开发流程支撑创新业务
查看>>
FreeWheel业务系统微服务化过程经验分享
查看>>
移动互联网下半场,iOS开发者如何“高薪”成长?
查看>>
Atlassian是怎样进行持续交付的?且听 Steve Smith一一道来
查看>>
Web Storage相关
查看>>
[PHP内核探索]PHP中的哈希表
查看>>
Apache-drill Architechture
查看>>