位置: 编程技术 - 正文

Javascript学习笔记之函数篇(六) : 作用域与命名空间(javascript基础笔记)

编辑:rootadmin

推荐整理分享Javascript学习笔记之函数篇(六) : 作用域与命名空间(javascript基础笔记),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript教程完整版,javascript教程完整版,javascript教程推荐知乎,javascript入门教程,javascript学习指南,javascript如何学,javascript入门教程,javascript基础笔记,内容如对您有帮助,希望把文章链接给更多的朋友!

在之前的介绍中,我们已经知道 Javascript 没有块级作用,只有函数级作用域。

Javascript 中也没有显示的命名空间,这就意味着一切都定义在全局作用域中。每一次引用一个变量时,Javascript 会往上遍历整个全局作用域直到找到该变量。如果遍历完整个全局作用域仍然没有找到该变量,则抛出一个 ReferenceError 错误。

请输入图片描述

隐式全局变量

上面的两个例子产生不一样的效果。第一个将在全局作用域中定义变量 foo,而第二个则在当前作用域定义变量 foo。我们一定要注意,如果不使用关键字 var 将会带来意想不到的影响。

由于在函数 test 内没用 var 来定义变量 foo,所以将覆盖函数外部的全局变量 foo。尽管看上去不是什么大问题,但是如果有成千上万行代码时,这将是个难以追踪的 bug。

上例中,外部的循环将会在执行第一次的时候就停止,这是因为 subloop 函数内部的变量 i 将会覆盖外部的全局变量 i。我们只需要在函数内部加上一个 var 就可以避免这个错误,所以我们在定义变量时一定不要忘记加上关键字 var。除非我们确实希望对外部的全局变量造成影响。

局部变量

Javascript 中局部变量只可以通过两个方式产生,一是通过关键字 var 来声明,一是作为函数的形参。

此时,函数 test 内部的变量 i 和 foo 是局部变量,而 bar 则会覆盖外部的全局变量 bar。

提升(Hoisting)

Javascript 将会提升变量声明,这就意味着 var 表达式和函数声明都将被提升到作用域的顶部。

Javascript学习笔记之函数篇(六) : 作用域与命名空间(javascript基础笔记)

上面的代码在运行之前, var 表达式和函数 test 的声明都将提升至顶部,因此程序将正常运行并不会报错。

由于 Javascript 没有块级作用域,这不仅将提升 var 表达式,同时也会使得 if 结构变得不够直观。在上例中,尽管看上去 if 在对全局变量 goo 进行操作,实际上,由于变量 goo 被提升,所以修改的是局部变量。如果没有对提升规则有所了解,你可能会认为下面的代码将会抛出 ReferenceError 错误。

当然上面的代码是没有错误的,因为在代码在运行前,var 表达式已经被提升到顶部。

这里要推荐下 @nightire 凡哥的博文 《理解 JavaScript(二)》,里面对提升的讲解非常透彻。名称解析顺序

当尝试在一个函数作用域内访问一个 foo 变量时,Javascript 将会按照下面的顺序查找:

当前作用域内是否有 var foo 的定义。函数形参中是否有 foo 变量。函数自身的名称是否为 foo。跳到外层定义域,再从第一部开始查找起。命名空间

一个最常见的问题就是命名冲突,这是因为 Javascript 只有一个全局作用域所带来的。但这个问题可以通过匿名的外部函数解决。

上例中的匿名函数被认为是表达式,所以它们会被执行。

当然我们也可以用其他方式来调用函数表达式,不同的结构,但是同样的效果。

总结

建议大家使用匿名的外部函数来将代码封装到空间内,这样不仅可以解决命名空间的冲突,同时也有利于程序的模块化。此外,使用全局变量不是一个好习惯,这将带来高成本的维护代价而且容易产生错误。

命名空间同类型、函数、变量、模板等都属于实体(entity)。实体的主要的共性是,可以具有名称。(此外,标签也可以具有名称,但它不是实体。)而命名空间作用域是作用域中的一类统称,和块作用域、类作用域、函数原型作用域、函数作用域(仅对标签有效)并列。命名空间内声明的名称在命名空间作用域中。全局名称被认为在隐含的全局命名空间作用域中。

命名空间作用确实就是作用域,但是,他又不同于简单的作用域,你可以分多次在多处声明同一个命名空间,但是里面的内容不能重定义,他们最终都会合成一个命名空间,就像std,到处宏定义

Javascript 赋值机制详解 今天回答了一个关于Javascript的问题,涉及到了赋值问题,因此想把这个问题好好总结下。vara='test';varb=function(){};b.a='test';functionchange(m,n){m='change';n.a='chang

Javascript学习笔记之数组的遍历和 length 属性 尽管数组在Javascript中是对象,但是不建议使用forin循环来遍历数组,实际上,有很多理由来阻止我们对数组使用forin循环。因为forin循环将会枚举原型链

Javascript学习笔记之数组的构造函数 数组的构造函数由于数组的构造函数在处理参数时的不确定性,因此强烈建议使用[]符号来创建一个新数组。[1,2,3];//Result:[1,2,3]newArray(1,2,3);//Result:[1,2,3][

标签: javascript基础笔记

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

上一篇:Javascript学习笔记之函数篇(五) : 构造函数(javascript总结笔记)

下一篇:Javascript 赋值机制详解(js赋值input)

  • 发票超过认证期有什么影响
  • 出口退税发票必须是专票吗
  • 营业外收入在所得税表中填入哪个科目
  • 自己打印的机票怎么退票
  • 工会福利费列支范围
  • 小规模纳税人无进项票怎么办
  • 土地增值税预缴最新税法规定
  • 未加盖发票专用章的发票是不合规
  • 购房40%税款第二年抵扣如何做账
  • 实际入库数量怎么算
  • 通讯费企业所得税计算
  • 变更公司名称注册时间会变吗
  • 外地预缴企业所得税汇算清缴退税
  • 滴滴普票可以抵扣进项么
  • 收到专项拨款属于什么科目
  • 银行存款日记账和现金日记账的区别
  • 折现率为10%怎么算折现系数是多少
  • 民间非营利组织会计制度最新版
  • WIN7系统的镜像文件在哪里
  • mac os 10.15安装教程
  • 购买方已认证的专票怎么红冲
  • 汽车报废残值收入怎么做账
  • 房产税应计入哪个会计科目
  • 开具增值税发票哪些情形不用交税?
  • 赔付支出有哪些
  • 坎伯兰森林西部
  • 纽格尔官网
  • 当年盈余资金计算公式
  • 鬓角头发剃光了多久能长好
  • php redis数据类型
  • antd:ConfigProvider+getPopupContainer解决筛选框遮挡问题(及其他浮层问题)
  • c++ array
  • 收到利息收入计入什么科目
  • 挂靠方项目部账务是否并入被挂靠方公司账务?
  • 房产税收特点有哪些
  • 织梦程序
  • 小于500的费用没有发票怎么做账
  • 运输公司燃油费占比
  • 企业所得税季度预缴怎么计算
  • 未收回的货款属于什么会计科目
  • 异地预缴税款多交了有影响吗
  • 转让旧固定资产怎么处理
  • 购入固定资产入账会计凭证怎么做
  • 按差额征税
  • 业务招待费税前扣除标准2020
  • 买税盘的分录
  • 公司试驾车怎么开票
  • 全额计提的坏账怎么做账
  • 小规模纳税人缴税的分录
  • 交易或事项对会计等式的影响基本类型
  • 什么叫系统服务
  • 工业企业会计与管理论文
  • 企业给职工提供的免费住房是不是合法住宅?
  • 工资薪金个人所得税扣除标准
  • 汇兑损益是什么凭证类型
  • 应付账款用什么方法清查
  • macos mysql
  • docker部署zookeeper集群
  • windows地图导航
  • w10英雄联盟老是崩溃
  • windows media player找不到媒体流
  • 怎么查看macbook air序列号
  • mac自带计算器
  • win10重置系统快捷键
  • Win10系统怎么使用经典事件查看器?
  • win8.1玩游戏好不好
  • bootstrap-treeview.js
  • android打包原理
  • JavaScript splice()方法详解
  • javascript要怎么学
  • 从最近两会看苹果和谷歌的最大梦魇
  • javascript函数的定义
  • jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
  • EasyUI Pagination 分页的两种做法小结
  • 国税局国家公务员工资待遇
  • 山东省国税地税体制改革
  • 河南三门峡税务社保缴费电话
  • 可以在企业所得税税前扣除的税金
  • 广东省上交国家财政
  • 酒精税收分类编码查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设