JavaScript高级程序设计之函数表达式

函数表达式是JS中一个强大的特性,尤其是ES6支持Lamada表达式后,更是锦上添花。在前边的文章介绍中,曾经介绍过一种创建函数的方式,函数声明,对函数表达式也有简单介绍。这章将会对函数表达有更详细的介绍。

函数表达式最常用的定义方式为:const a = function(){}。其中function是一个匿名函数(也可叫Lamada函数),因为函数的关键字后面没有标识符,也就是说函数的name属性是一个字符串。

函数表达式与函数声明除了一个有标识符和一个没有标识符之外,还有一个很重要的区别,那就是声明提前。所谓声明提前,就是无论函数写在调用前还是调用后,都可以正常得进行调用,不会报错。普通的函数声明,会具有此特性,而函数表达式则没有这个特性。因为函数表达式,归根结底是一个表达式,它和其它赋值表达式没有什么区别,唯一的区别就是它把函数作为值赋给了变量。

闭包

闭包也是JS中比较重要的概念,经常有人搞不清什么是闭包,其实闭包的原理很简单,就是指一个函数有权去访问另一个函数里的变量。闭包最常用的地方就是,一个函数里边,嵌套了另一个函数,嵌套的函数使用了外边这个函数里的变量。在之前文章中讲过,JS中的函数也是对象,拥有自己的属性和方法。那这和作用域链有什么关系呢?其实作用域链就是嵌套函数对象的[Scope]属性存储了一份对外部函数对象的引用。而正是这份引用,使得内部函数可以访问到外部函数的变量,从而造就了闭包。在没有闭包的情况下,随着函数的调用结束,作用域链也会随之销毁,但在使用闭包的时候,外部函数仍然会随着调用结束,而被销毁掉,但是由于闭包,作用域链中指向外部函数对象的引用并不会消失,直到内部函数被销毁后,才会被销毁。

闭包与变量

在使用闭包的时候,内部函数只能取到外部函数变量的最后一个值。这是闭包的一个缺点。那为啥这样呢?这是因为函数中的变量被存到了一个变量对象里边,供内部函数访问。大家都知道,放在对象里边的数据,被称之为属性,而正因为变成了属性,所以内部函数访问的时候,总是访问到最后一个值。解决方案,就是能一个立即执行的匿名函数,然后把值总是会变得变量,当做参数传递进去。

关于this对象

在使用闭包的时候,this指向也是一个问题。JS中函数是会绑定this的,作为函数的函数this是指向Window,作为方法的函数this是指向对象本身,而在方法内部的函数,因为是作为函数存在的,因此它的this指向仍然是Window。如果把方法赋值给变量,用这个变量调用的话,它的this指向也是Window。而这一切的原因,就是因为它们不再是方法,而是作为函数存在。不过虽然存在这样的问题,但是我们可以通过lamada表达式,call、apply、bind、或定义变量存储this的方式,来实现对方法this的访问。

 

内存泄漏

转载于:https://www.cnblogs.com/wangyinqian/p/7904859.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异常在哪一层处理_WiFi速度慢,信号不稳定,除了重启路由器外,自己能怎么处理?...

前言WiFi出了故障,速度慢,信号不稳定,自己处理,除了重启路由器,也没有什么别的招了;好在这万能重启,差不多能解决一大半的小故障;那信号不好,速度慢,不稳定&a…

python输入输出代码_python基本输入输出代码示例

#!/usr/bin/env python# -*- coding: utf-8 -*-#输入与输出#str()与repr()for x in range(1, 11):print repr(x).rjust(2), repr(x*x).rjust(3),#逗号代表不换行print repr(x*x*x).rjust(4)#格式化输出for x in range(1, 11):print {0:2d} {1:3d} {2:4d}.format(x, x*x, x*x*x)…

linux运维、架构之路-HAProxy反向代理

一、HAProxy介绍 专业反向代理,支持双机热备支持虚拟主机,配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端节点出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入,基于TCP和HTTP应用的代理软件,开源免费、快速并且可靠的…

java洗牌_java语言实现简单的洗牌,发牌

packagecom.java.lei.homework;importjava.util.Arrays;importjava.util.Random;public classPokerGame {//1.创建数组,用以存储扑克牌static String[] pokers new String[54];public static voidmain(String[] args) {//2.创建牌 所有的牌赋值到array数组中pokers…

CSS3 3D transform变换

transform的坐标是需要了解的特性。 我们的rotateX,rotateY,rotateZ,和translateX,translateY等都是基于相同的坐标系来定位的。 3D的坐标如下入所示: 3D transform中有下面这三个方法: rotateX( angle )rotateY( angle )rotateZ( angle )理解了这三个方…

vba结束本次循环进行下次_VBA掌握循环结构,包你效率提高500倍

这是系列免费教程《Excel VBA:办公自动化》,还是老规矩,看看我们走到哪里了。1.认识VBA:什么是VBA?2.这些掌握了,你才敢说自己懂VBA3.VBA变量5年踩坑吐血精华总结4.VBA中重要的强制申明,谁看谁明…

CefSharp 支持MP4

效果图: 下载链接:https://share.weiyun.com/d1e249ef5c56b4d909b2124dc2dd8902 创建Wpf项目引用 如下: 第一步:创建项目引用CefSharp 第二步:将DLL拷贝到运行项目的Debug下 第三步:项目平台设置32位 第四…

python定义字典列表_Python基础语法(四)—列表、元组、字典、集合、字符串

列表基本概念列表是有序的元素集合,所有元素放在一对中括号中,用逗号隔开,没有长度限制;列表索引值以0为开始值,-1为从未尾的开始位置。列表可以使用操作符进行拼接,使用*表示重复。当列表元素增加或删除时…

ReentrantLock 分析

带着疑问去分析 ReentrantLock是如何实现锁管理的。ReentrantLock是如何实现重入的。ReentrantLock是如何实现公平锁与非公平锁。ReentantLock的公平锁为什么一般情况下性能都比公平锁查。ReentrantLock数据结构 ReentrantLock的底层是借助于AbstractQueuedSynchronizer实现的&…

v4l2 框架下如何设置分辨率_Linux下如何进行FTP设置

目录: 一、Redhat/CentOS安装vsftp软件二、Ubuntu/Debian安装vsftp软件一、Redhat/CentOS安装vsftp软件1.更新yum源yum update -y2.安装vsftpyum install vsftpd -y3.修改配置文件vi /etc/vsftpd/vsftpd.conf # 原有初始配置 local_umask022 dirmessage_enableYES x…

java ztree json_java递归实现ztree树结构数据展示

//获得zTree结构的数据(测试AuthInfo)RequestMapping("/getAuthInfoTree.action")public void getAuthInfoTree(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("getAuthInfoTree")…

2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结

2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结 【学习内容:第九章——虚拟存储器】 一、课本内容梳理 1.虚拟存储器 作用: 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和…

vscode弹出cmd_先看看 VS Code Extension 知识点,再写个 VS Code 扩展玩玩

TL;DR文章篇幅有点长 ,可以先收藏再看 。要是想直接看看怎么写一个扩展,直接去第二部分 ,或者直接去github看源码 。第一部分 --- Extension 知识点一、扩展的启动如何保证性能 --- 扩展激活(Extension Activation) 我…

Part5 数据的共享与保护 5.4类的友元5.5共享数据的保护

友元是C提供的一种破坏数据封装和数据隐藏的机制。通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用…

webp转换gif_用 WebP 创建尺寸更小、细节更丰富的图片,以此来提高网站的速度...

WebP 文件格式是一种基于 RIFF(资源互换文件格式)的文档格式。WebP 是 2010 年 Google 开发的一种图片格式,它为网页上的图片提供了卓越的无损和有损压缩。网站开发者们可以使用 WebP 来创建尺寸更小、细节更丰富的图片,以此来提高网站的速度。更快的加载…

myeclipse java注释模板_Eclipse/MyEclipse Java注释模板设置详解 ---转载自百度空间

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一介绍:文件(Files)注释标签:/*** Title: ${file_name}* Package ${package_name…

php之快速入门学习-9(switch)

PHP Switch 语句 switch 语句用于根据多个不同条件执行不同动作。 PHP Switch 语句 如果您希望有选择地执行若干代码块之一&#xff0c;请使用 switch 语句。 <?php switch (n) { case label1:如果 nlabel1&#xff0c;此处代码将执行;break; case label2:如果 nlabel2&…

python 如何判断excel单元格为空_如何用python处理excel(二)

读取excelimport xlrdworkbookxlrd.open_workbook(rC:\Users\Desktop\hebing\学生登记表.xls)sheetworkbook.sheet_by_index(0)#根据序列号来打开某一个sheetrowsheet.nrows#将excel的行数赋值给变量colsheet.ncols#将excel的列数赋值给变量print(sheet.cell_value(1,0))#打印出…

mysql 事务 数量_MySQL 数据查询语言(DQL) 事务控制语言(TCL)详解

一、 数据查询语言(DQL)(重中之重)完整语法格式&#xff1a;select 表达式1|字段,....[from 表名 where 条件][group by 列名][having 条件][order by 列名 [asc|desc]][limit 位置,数量]<1> 普通查询select 查询表达式; // 最简单的sql语句&#xff0c;是一个函数select…

web前端到底是什么?有前途吗

web前端到底是什么&#xff1f; 某货&#xff1a; “前几年前端开发人员鱼目混杂&#xff0c;技术参差不齐&#xff0c;相对学习起来不规范&#xff0c;导致> 前端开发人员聚集&#xff0c;所以现在前端工种和工资还是没得到普遍重视&#xff0c;但近2年来&#xff0c;> …