位置: 编程技术 - 正文

跟我学习javascript的函数和函数表达式(java 视频教程)

编辑:rootadmin

推荐整理分享跟我学习javascript的函数和函数表达式(java 视频教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java教程 视,java教程,java script,java script,java script教程,java教程,java教程,java script,内容如对您有帮助,希望把文章链接给更多的朋友!

1、函数声明与函数表达式

在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:

函数声明:function 函数名称 (参数:可选){ 函数体 }

函数表达式:function 函数名称(可选)(参数:可选){ 函数体 }

所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。

表达式和声明存在着十分微妙的差别,首先,函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值,参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了:

另外,还有一点需要提醒一下,函数声明在条件语句内虽然可以用,但是没有被标准化,也就是说不同的环境可能有不同的执行结果,所以这样情况下,最好使用函数表达式: 因为在条件语句中没有块级作用域这个概念

函数声明的实际规则如下:

函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ … })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

2、命名函数表达式

提到命名函数表达式,理所当然,就是它得有名字,前面的例子var bar = function foo(){};就是一个有效的命名函数表达式,但有一点需要记住:这个名字只在新定义的函数作用域内有效,因为规范规定了标示符不能在外围的作用域内有效:

跟我学习javascript的函数和函数表达式(java 视频教程)

既然,这么要求,那命名函数表达式到底有啥用啊?为啥要取名?

正如我们开头所说:给它一个名字就是可以让调试过程更方便,因为在调试的时候,如果在调用栈中的每个项都有自己的名字来描述,那么调试过程就太爽了,感受不一样嘛。

tips:这里提出一个小问题:在ES3中,命名函数表达式的作用域对象也继承了 Object.prototype 的属性。这意味着仅仅是给函数表达式命名也会将 Object.prototype 中的所有属性引入到作用域中。结果可能会出人意料。

该程序看起来会产生 null, 但其实会产生一个新的对象。因为命名函数表达式在其作用域内继承了 Object.prototype.constructor(即 Object 的构造函数)。就像 with 语句一样,这个作用域会因 Object.prototype 的动态改变而受到影响。幸运的是,ES5 修正了这个错误。

这种行为的一个合理的解决办法是创建一个与函数表达式同名的局部变量并赋值为 null。即使在没有错误地提升函数表达式声明的环境中,使用 var 重声明变量能确保仍然会绑定变量 g。设置变量 g 为 null 能确保重复的函数可以被垃圾回收。

3、调试器(调用栈)中的命名函数表达式

刚才说了,命名函数表达式的真正用处是调试,那到底怎么用呢?如果一个函数有名字,那调试器在调试的时候会将它的名字显示在调用的栈上。有些调试器(Firebug)有时候还会为你们函数取名并显示,让他们和那些应用该函数的便利具有相同的角色,可是通常情况下,这些调试器只安装简单的规则来取名,所以说没有太大价值,我们来看一个例子:不用命名函数表达式

通过查看调用栈的信息,我们可以很明了地知道foo调用了bar, bar又调用了baz(而foo本身有在expr_test.html文档的全局作用域内被调用),不过,还有一个比较爽地方,就是刚才说的Firebug为匿名表达式取名的功能:

然后,当函数表达式稍微复杂一些的时候,调试器就不那么聪明了,我们只能在调用栈中看到问号:

另外,当把函数赋值给多个变量的时候,也会出现令人郁闷的问题:

这时候,调用栈显示的是foo调用了bar,但实际上并非如此,之所以有这种问题,是因为baz和另外一个包含alert(‘spoofed')的函数做了引用交换所导致的。

归根结底,只有给函数表达式取个名字,才是最委托的办法,也就是使用命名函数表达式。我们来使用带名字的表达式来重写上面的例子(注意立即调用的表达式块里返回的2个函数的名字都是bar):

好的,整个文章结束,大家对javascript的认识又近了一步,希望大家越来越喜欢小编为大家整理的文章,继续关注跟我学习javascript的一系列文章。

种JavaScript常用的MVC框架比较分析 本文详细讲述了种JavaScript常用的MVC框架。分享给大家供大家参考,具体如下:GordonL.Hempton是西雅图的一位黑客和设计师,他花费了几个月的时间研究

跟我学习javascript的函数调用和构造函数调用 一、函数调用Function绝对是JavaScript中的重中之重。在JavaScript中,Function承担了procedures,methods,constructors甚至是classes以及modules的功能。在面向对象程序设

跟我学习javascript的call(),apply(),bind()与回调 一、call(),apply(),bind()方法JavaScript中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新

标签: java 视频教程

本文链接地址:https://www.jiuchutong.com/biancheng/384617.html 转载请保留说明!

上一篇:跟我学习javascript的var预解析与函数声明提升(java script)

下一篇:12种JavaScript常用的MVC框架比较分析

  • 会计利润和应纳税所得额的区别和联系
  • 分公司承担总公司差旅
  • 新公司成立需要刻哪些章
  • 哪些津贴不扣税
  • 其他应收款利息收入会计分录怎么写
  • 发票几个月内可以红冲作废
  • 个税申报赡养老人可以填公婆吗
  • 换出交易性金融资产入账价值
  • 个税全年一次性奖金单独计税
  • 以土地出资土地增值税
  • 保证金交易收益率
  • 亏损企业所得税弥补
  • 应征消费税的汽车为啥不能抵扣
  • 银行客户专用回单分录
  • 股票投资收益需要缴纳增值税吗
  • 工商年报中的纳税总额是所属期应交还是实交税额
  • 帮对方公司垫付违法吗
  • 公司免费使用我的肖像权用作商业
  • 电商销售进对公账户怎样做账
  • 工厂生产的配件怎么入账
  • 作废章盖在哪个位置
  • 小规模免增值税印花税用交吗
  • 原料采购入库检测损耗的会计处理怎么做?
  • 会计核算的主要依据是什么
  • 合同取得成本计入当期损益吗
  • 电信apn接入点设置+最快
  • 清空收藏夹里面的歌曲
  • 关于工程施工的劳动法规
  • 公司奖金没有按时发可以要吗
  • 监控工程付款方式
  • PHP:session_start()的用法_Session函数
  • 委托代建的法律规定
  • 什么是应交税费未交增值税
  • 接受捐赠和对外捐赠分录
  • 哈德良长城和中国长城的区别
  • php支付功能
  • 所得税季报资产总额怎么算
  • 偿还应付账款会使得资产报酬率增加吗
  • 加收税收滞纳金属于行政处罚吗
  • 货到付款付的是什么费用
  • 公司购买一台电脑低于3000元怎么办
  • 分公司非独立核算企业所得税处理
  • 织梦使用教程
  • 小规模缴纳印花税吗怎么做账
  • 财务费用相关指标
  • 发行的企业债券属于所有者权益吗
  • SQLserver2008数据库Excel数据导入语句
  • sqlserver无法打开备份设备
  • 进项税额不得抵扣的情况
  • 公司开发新产品时,由管理层任命的
  • 一般纳税人无票收入怎么做账分录呢
  • 待摊费用和预提费用都属于资产类科目
  • 税务师报名条件和要求
  • 春节重要通知发放工资
  • 研发产品入库
  • 制造费用影响什么
  • 理财产品利息计入本金吗
  • 哪些发票可以报账
  • 增值税购进扣税法
  • 什么是固定资产的后续支出
  • 年化利率是什么意思
  • mysql几天能学会
  • u盘装系统系统资料会被泄露吗
  • windows media player在播放文件时遇到问题怎么解决
  • Remind_XP.exe - Remind_XP是什么进程 有什么用
  • 系统解决问题的方法
  • windows xp系
  • win10更新补丁导致打印机
  • ,linux
  • 公认的经典
  • android颜色代码表
  • javascript要怎么学
  • android怎么学
  • 9月1日起陕西省房产契税新政
  • 个人经营所得税怎么做账务处理
  • csc联合培养博士资助标准
  • 个人社保缴纳年限怎么算
  • 襄城是现在的哪个城市
  • 沈阳税务局营业时间查询
  • 长春税务局电话朝阳区
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设