位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享跟我学习javascript的var预解析与函数声明提升(java script),希望有所帮助,仅作参考,欢迎阅读内容。

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

1、var 变量预编译

JavaScript 的语法和 C 、Java、C# 类似,统称为 C 类语法。有过 C 或 Java 编程经验的同学应该对“先声明、后使用”的规则很熟悉,如果使用未经声明的变量或函数,在编译阶段就会报错。然而,JavaScript 却能够在变量和函数被声明之前使用它们。下面我们就深入了解一下其中的玄机。

先来看一段代码:

运行上面代码立马就报错,不过,这也正是我们期望的,因为 noSuchVariable 变量根本就没有定义过嘛!再来看看下面的代码:

首先,上面这段代码是正确的,没有任何问题。但是,为什么不报错了?declaredLater 变量是在调用语句后面定义的啊?为什么居然输出的是 undefined?

这其实是 JavaScript 解析器搞的鬼,解析器将当前作用域内声明的所有变量和函数都会放到作用域的开始处,但是,只有变量的声明被提前到作用域的开始处了,而赋值操作被保留在原处。上述代码对于解析器来说其实是如下这个样子滴:

这就是为什么上述代码不报异常的原因!变量和函数经过“被提前”之后,declaredLater 变量其实就被放在了调用函数的前面,根据 JavaScript 语法的定义,已声明而未被赋值的变量会被自动赋值为 undefined ,所以,第一次打印 declaredLater 变量的值就是 undefined,后面我们对 declaredLater 变量进行了赋值操作,所以,第二次再打印变量就会输出Now it's defined!。

再来看一个例子:

上述代码中,我们先声明了一个变量 name ,我们的本意是希望在第一次打印 name 变量时能够输出全局范围内定义的 name 变量,然后再在函数中定义一个局部 name 变量覆盖全局变量,最后输出局部变量的值。可是第一次输出的结果和我们的预期完全不一致,原因就是我们定义的局部变量在其作用域内被“提前”了,也就是变成了如下形式:

由于 JavaScript 具有这样的“怪癖”,所以建议大家将变量声明放在作用域的最上方,这样就能时刻提醒自己注意了。

2、函数声明“被提前”

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

前边说的是变量,接下来我们说说函数。

函数的“被提前”还要分两种情况,一种是函数声明,第二种是函数作为值赋值给变量,也即函数表达式。

先说第一种情况,上代码:

如上所示,JavaScript 解释器允许你在函数声明之前使用,也就是说,函数声明并不仅仅是函数名“被提前”了,整个函数的定义也“被提前”了!所以上述代码能够正确执行。

再来看第二种情况:函数表达式形式。还是先上代码:

我们做了一个对比,definitionHoisted 函数被妥妥的执行了,符合第一种类型;definitionNotHoisted 变量“被提前”了,但是他的赋值(也就是函数)并没有被提前,从这一点上来说,和前面我们所讲的变量“被提前”是完全一致的,并且,由于“被提前”的变量的默认值是 undefined ,所以报的错误属于“类型不匹配”,因为 undefined 不是函数,当然不能被调用。

总结 通过上面的讲解可以总结如下:

变量的声明被提前到作用域顶部,赋值保留在原地函数声明整个“被提前”函数表达式时,只有变量“被提前”了,函数没有“被提前”3、var的副作用

隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。

通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的:

在ES5严格模式下,未声明的变量(如在前面的代码片段中的两个反面教材)工作时会抛出一个错误。

4、单var形式声明变量

在函数顶部使用单var语句是比较有用的一种形式,其好处在于:

提供了一个单一的地方去寻找功能所需要的所有局部变量防止变量在定义之前使用的逻辑错误少代码(类型啊传值啊单线完成) 单var形式长得就像下面这个样子:

您可以使用一个var语句声明多个变量,并以逗号分隔。像这种初始化变量同时初始化值的做法是很好的。这样子可以防止逻辑错误(所有未初始化但声明的变量的初始值是undefined)和增加代码的可读性。在你看到代码后,你可以根据初始化的值知道这些变量大致的用途。

标签: java script

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

上一篇:跟我学习javascript的全局变量(java learning)

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

  • 小规模纳税人补税怎么补
  • 资产处置损益影响所有者权益总额吗
  • 资金账簿印花税最新政策2022年
  • 个人所得税年底返税
  • 银行付款回单怎么看
  • 社会保险申报表中工资总额累计金额是什么意思
  • 属于劳务分包合同
  • 存货计提跌价准备什么意思
  • 印花税缴款了发现报错了怎么办?
  • 扣员工餐费需要缴纳个税吗
  • 工业结转成本方法有哪些?
  • 职工的大病医保怎么报销
  • 个人去税务局开票流程
  • 跨区域施工要交什么税
  • 小微企业免征税额
  • 按折现率计算现值
  • 不得抵扣啥意思
  • 政府专项拨款账务处理
  • 红字增值税发票含税吗
  • 营改增后哪些费用可以抵扣
  • 场地维修属于什么费用
  • 华为nova9值得买吗知乎
  • 完成交易预付账怎么做账
  • 消防工程改造需要什么资质
  • 入账成本包括增值税税额吗
  • php中字符串函数
  • 社保退休金计算方法
  • mis.off c n
  • 出口退税转内销的话如何算发票金额
  • PHP:is_uploaded_file()的用法_Filesystem函数
  • 原材料入库时如何计价
  • vite + vue + ts 自动按需导入 Element Plus组件,并如何解决按需引入后ElMessage与ElLoading 的问题(找不到名称“ElMessage”问题。)
  • 自然vc
  • 用友的应付单和付款单的区别各是什么时候填制
  • php封装api
  • Cursor!!!GPT-4帮我写代码
  • 腾讯一面问什么
  • js遇到的问题
  • init 4命令
  • sort文件名
  • php curl_setopt
  • 债券溢折价摊销
  • 火车及机票退票扣多少钱
  • 土地给人家种了几十年还能要回来吗
  • 存货跌价准备的结转会计分录
  • 电子回单可以入档案吗
  • 增值税抵扣比例是多少
  • 印花税申报成功怎么撤回
  • 如何降低未分配利润的方法
  • 销售货物收入指企业销售什么取得的收入
  • 亏损企业对外捐赠的税前扣除
  • 滴滴打车老板起源故事
  • 简易征收怎么申报
  • 企业垫付是什么意思
  • 工商营业执照变更网上怎么操作
  • 融资费用包括什么?
  • 个人发票单位能做账用吗
  • 工厂宿舍水电费怎么扣
  • 计提工会经费如何扣除
  • 销售佣金?
  • 购买办公软件的进项发票可以抵扣吗
  • sql server 自增列设置语句
  • win7登录密码怎么改
  • win8系统运行窗口怎么打开
  • w8系统怎么删除软件
  • win102020h2版本
  • The graphics pipeline ,Open GL 渲染管线
  • shell中break和continue
  • 背景透明度设置
  • python第三方库文档怎么看
  • 如何利用工具人
  • JavaScript中length属性的使用方法
  • jstree异步加载
  • 增值税发票的发票号码和发票代码
  • 河北地方税务局网
  • 工程开具增值税专用发票
  • 哈尔滨银行网上银行怎么开通
  • 合肥报税网站
  • 00后先进人物事迹简介
  • 发票盖哪几联
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设