变量作用域

由 学院君 创建于1年前, 最后更新于 1年前

版本号 #2

724 views

0 likes

0 collects

变量的作用域指的是程序源码中定义这个变量的区域,全局变量具有全局作用域,可以在 JavaScript 代码中任意位置使用,而在函数内声明的变量只能在函数内使用,属于局部变量,函数参数也是局部变量,只在函数体内有定义。

需要注意的几点:

在函数体内局部变量的优先级高于全局变量,如果存在变量同名问题,局部变量会覆盖全局变量;

全局变量声明时可以不使用 var 语句,但是局部变量声明时必须使用;

函数定义可以嵌套,这个时候要格外注意局部变量的作用域。

函数作用域

函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是可用的,甚至在变量声明之前就可以使用,JavaScript 的这一特性被非正式的称为声明提前。

在执行第一条 console.log 语句时,局部变量已经覆盖了全局变量,但是还没有走到赋值语句那里,所有打印的是 undefined,赋值之后才打印出 local。由此可见,在函数体内的所有变量声明都是提前到了函数体顶部,而初始化则是在声明处。

作为属性的变量

当声明一个 JavaScript 全局变量时,实际上定义了全局对象的一个属性(ECMAScript 规范规定),当使用 var 声明一个变量时,创建的这个属性是不可配置的(不可以通过 delete 运算符删除),如果没有通过 var 声明的全局变量则是正常的可配置的属性:

局部变量也可以理解为跟函数调用相关的某个对象的属性,但是却不能通过类似全局变量那样通过 this 进行引用,这种存放局部变量的特有性质是一种对我们不可见的内部实现。

作用域链

如果将局部变量看作是自定义实现的对象的属性的话,那么可以换个角度来解读变量作用域,每段 JavaScript 代码都有一个与之关联的作用域链,这个作用域链是一个对象列表或链表,对象中定义了作用域中的变量。

在 JavaScript 最顶层代码中,作用域链由一个全局对象组成;在不包含嵌套的函数体中,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象;在一个嵌套的函数体内,作用域链上至少有三个对象,每次调用外部函数时,内部函数需要重新定义一遍,因为每次调用外部函数时,作用域链可能都是不同的。

当 JavaScript 需要做变量解析时(比如查找变量 x),它会从链中的第一个对象开始查找,如果链中有一个名为 x 的属性,则直接使用这个属性值;如果不存在的话则会查找链上的下一个对象,依次类推,如果链上所有对象都没有包含属性 x,则认为属性 x 不存在,抛出一个引用错误异常。

作用域的概念对于理解 with 语句和闭包的概念都很有帮助。

mysql变量作用域,变量作用域 | 类型、变量和值 | JavaScript 权威指南相关推荐

  1. javascript权威指南 学习笔记之变量作用域

    最近一直在看<javascript权威指南 第五版>,变量作用域这一章,看得真的有点累.不过,收获还是多多. 不知道,大家对语言中变量的"声明"与"定义&qu ...

  2. 设以下变量均为int类型,则值不等于7的表达式是

    设以下变量均为int类型,则值不等于7的表达式是 A)(x=y=6,x+y,x+1) B)(x=y=6,x+y,y+1) C) (x=6,x+1,y=6,x+y) D) (y=6,y+1,x=y,x+ ...

  3. mysql请输入一个有效类型的长度值_MySQL数据库基础(三)——SQL语言

    MySQL数据库基础(三)--SQL语言 发布时间:2020-05-19 16:40:05 来源:51CTO 阅读:10596 作者:天山老妖S MySQL数据库基础(三)--SQL语言 一.SQL语 ...

  4. Javascript 权威指南第五版 手记(2) 变量的作用域

    作用域的一些问题 写于平安夜 见书本第四章,先用四段简单的脚本,来做个,实例测试 示例1: var PH='you are big Pig Head'; function getAlert() { a ...

  5. javascript变量声明 及作用域

    javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...

  6. Go开发 之 基础语法(变量的声明、初始化、作用域,匿名变量,多变量赋值,变量逃逸分析)

    文章目录 1.变量的声明 1.1.标准格式 1.2.简短格式 1.3.批量格式 2.变量的初始化 2.1.标准格式 2.2.编译器推导类型的格式 2.3.声明并初始化 3.多个变量同时赋值 4.匿名变 ...

  7. 串讲-解释篇:作用域,作用域链,执行环境,变量对象,活动对象,闭包

    这篇接:理论篇:作用域,作用域链,执行环境,变量对象,活动对象,闭包 看例子: function compare(value1, value2) {if (value1 < value2) {r ...

  8. java中类变量局部量_java入门---变量类型类变量局部变量实例变量静态变量

    在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: typeidentifier[= value][, identifier[= value]...]; 格式说明:type为Jav ...

  9. python怎么创建变量不赋值_python声明变量不赋值

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 动态类型的语言python是动态类型的语言,不需要声明变量的类型. 实际上,py ...

最新文章

  1. Stack Overflow requires external JavaScript from another domain, which is blocked or failed to load.
  2. windows云服务器价格_免费windows云服务器
  3. 二叉排序树经典算法速成
  4. function $(id) {}表示什么函数
  5. 【转】未能加载文件或程序集或它的某一个依赖项,系统找不到指定的文件
  6. python代码调试快捷键_6. Pycharm的传参、快捷键、执行代码、调试模式
  7. V1-bug Alpha阶段项目展示
  8. 知识图谱入门2-2:用户输入->知识库的查询语句
  9. 从入门到入土:在kali中安装Nessus详细操作
  10. Linux进程调度原理【转】
  11. python try except continue_python中 try、except、finally执行顺序
  12. 计算机相关技术资料整理
  13. int类型转换byte类型
  14. uni-app开发微信公众号H5网页,用微信开发者工具调试公众号
  15. ThingJS 开发使用感悟
  16. 2018年度中国IT行业杰出人物奖出炉
  17. windows防火墙
  18. maven 打包跳过单元测试
  19. Win7系统修复启动项命令
  20. 武汉市个人社保缴费证明网上打印操作流程

热门文章

  1. R语言使用ggplot2包使用geom_density()函数绘制密度图(连续色彩、离散色彩、梯度色彩)实战(density plot)
  2. R语言ggplot2可视化分面图、在分面图中的每个直方图中添加均值文本标签、添加均值红色竖线
  3. Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix)、使用replace函数批量删除列名中的后缀(suffix)
  4. Python使用matplotlib绘制透明背景的可视化图像并保存透明背景的可视化结果(transparent background)
  5. Python多分类问题下,micro-PR计算以及macro-PR计算
  6. python使用正则化检查字符串的起始和结束字符相同
  7. 酸奶饮料新产品口味测试研究案例
  8. ML基石_9_LinearRegression
  9. PaSS:用于 PacBio 测序的测序模拟器
  10. 破译“生命天书”20年