博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数、函数表达式、作用域、闭包
阅读量:6824 次
发布时间:2019-06-26

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

函数声明和函数表达式

var f = function () {    }function f() {    }

函数声明和函数表达式的主要区别是,函数声明会被前置,而函数表达式作为变量,会被提升。

下方是js执行时的逻辑

// 前置和变量提升var f;function f() {    }f = function () {    }

一道题考察知识掌握情况

var f = function () {    console.log(1)}function f() {    console.log(2)}f();

上方代码直接结果为:1

Function函数了解一下,不怎么常用

图片描述

闭包(不说话,看图就可以)

图片描述

一道题考察闭包(循环闭包)
var o = [];for(var i = 0; i < 5; i++){    o[i] = function () {        console.log(i)    }}o[3]();

以上代码执行结果为:5

如何改进以上代码,使o[1]=>1; o[2]=>2; ..., 那就是利用闭包咯

var o = [];for(var i = 0; i < 5; i++){    (function (i) {        o[i] = function () {            console.log(i);        }    })(i);}o[3]();

以上代码执行结果为:3

解析:

  • 第一种方法中,只有o[3]()执行时,才会用i,而i却一直在变化,等到o[3]()执行时,i已经是5了;
  • 第二种方法,运用了闭包,因为o[i]函数的上一层是自执行函数,因此所运用到的闭包参数i,在for循环过程中就已经固定,不再变化。等到o[3]执行时,固定的闭包参数就被释放了出来
  • 被面试的时候被问到这道题,问我除了闭包有没有其它方法,没答出来,原来将var改成let就可以了,竟然不知道
var o = [];for(let i = 0; i < 5; i++){    o[i] = function () {        console.log(i)    }}

闭包第二种应用场景(封装变量)

(function () {  var name = 'LHX';  var age = 30;  var export = {};    export.getName = function () {      return name;  }  export.setName = function (newName) {      name = newName;  }    window.export = export;})();呵呵,只有通过释放出来的export才能访问私有变量

闭包的缺陷

闭包中的变量因为可能还会被内部函数用到,因此所占内存一直不能被释放,导致内存浪费

转载地址:http://zhrzl.baihongyu.com/

你可能感兴趣的文章
Spring MVC 前后台传值
查看>>
我的友情链接
查看>>
使用node-webkit开发exe窗口程序
查看>>
图解:双IP地址引起的网络故障
查看>>
C语言第三天(文件)
查看>>
MongoDB: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
查看>>
第二章 数据,变量和计算
查看>>
openwrt无线连接互联网的实现原理【2】
查看>>
禁止用户使用ctrl+alt+Fn进行tty1-ttyn切换的设置
查看>>
nginx+keepalived+proxy_cache 配置高可用nginx群集和高速缓存
查看>>
Spring cloud 熔断器Hystrix
查看>>
postfix 邮件集群方案(02)
查看>>
内建控制结构之不再使用break和continue
查看>>
自己写的一个JavaScrpt输入验证
查看>>
我的友情链接
查看>>
warning: no newline at end of file的原因
查看>>
tar 无法解压带冒号的文件
查看>>
linux设置mysql,apache,tomcat开机启动
查看>>
javascript(十一) 弹出窗口/自定义窗口
查看>>
Spark 装载 MySQL的数据
查看>>