【html、CSS、javascript-8】JavaScript作用域
JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话
一、JavaScript中无块级作用域
在Java或C#中存在块级作用域,即:大括号也是一个作用域。
public static void main () {if(1==1){String name = "seven";}System.out.println(name); } // 报错 Java
Java中
public static void Main() {if(1==1){string name = "seven";}Console.WriteLine(name); } // 报错 C#
C#中
在JavaScript语言中无块级作用域
function Main(){if(1==1){var name = 'seven';}console.log(name); } // 输出: seven
二、JavaScript中采用函数作用域
在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。
function Main(){var innerValue = 'seven'; }Main();console.log(innerValue);// 报错:Uncaught ReferenceError: innerValue is not defined
三、JavaScript中的作用域链
由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。
xo = 'alex';function Func(){var xo = "seven";function inner(){var xo = 'alvin';console.log(xo);}inner(); } Func();
如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例:
当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。
四、JavaScript中的作用域链执行前已创建
JavaScript的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。
示例一:
xo = 'alex';function Func(){var xo = "seven";function inner(){console.log(xo);}return inner; }var ret = Func(); ret(); // 输出结果: seven
上述代码,在函数被调用之前作用域链已经存在:
- 全局作用域 -> Func函数作用域 -> inner函数作用域
当执行【ret();】时,由于其代指的是inner函数,此函数的作用域链在执行之前已经被定义为:全局作用域 -> Func函数作用域 -> inner函数作用域,所以,在执行【ret();】时,会根据已经存在的作用域链去寻找变量。
示例二:
xo = 'alex';function Func(){var xo = "eirc";function inner(){console.log(xo);}xo = 'seven';return inner; }var ret = Func(); ret(); // 输出结果: seven
上述代码和示例一的目的相同,也是强调在函数被调用之前作用域链已经存在:
- 全局作用域 -> Func函数作用域 -> inner函数作用域
不同的时,在执行【var ret = Func();】时,Func作用域中的xo变量的值已经由 “eric” 被重置为 “seven”,所以之后再执行【ret();】时,就只能找到“seven”。
示例三:
xo = 'alex';<br> function Bar(){console.log(xo); }function Func(){var xo = "seven";return Bar; }var ret = Func(); ret(); // 输出结果: alex
上述代码,在函数被执行之前已经创建了两条作用域链:
- 全局作用域 -> Bar函数作用域
- 全局作用域 -> Func函数作用域
当执行【ret();】时,ret代指的Bar函数,而Bar函数的作用域链已经存在:全局作用域 -> Bar函数作用域,所以,执行时会根据已经存在的作用域链去寻找。
五、声明提前
在JavaScript中如果不创建变量,直接去使用,则报错:
console.log(xxoo); // 报错:Uncaught ReferenceError: xxoo is not defined
JavaScript中如果创建值而不赋值,则该值为 undefined,如:
var xxoo; console.log(xxoo); // 输出:undefined
在函数内如果这么写:
function Foo(){console.log(xo);var xo = 'seven'; }Foo(); // 输出:undefined
上述代码,不报错而是输出 undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在“预编译”时,已经执行了var xo;所以上述代码中输出的是undefined。
转载于:https://www.cnblogs.com/sunshuhai/p/9112578.html
【html、CSS、javascript-8】JavaScript作用域相关推荐
- web前端(HTML的CSS样式和JavaScript)
HTML的CSS样式和JavaScript CSS CSS介绍 概念和作用 示例代码 CSS的规则和3种位置 CSS规则 CSS的位置 行内样式 内部样式 外部样式 三种样式的代码 CSS基本选择器( ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- 你不知道的JavaScript之词法作用域
词法作用域 总结一下作用域的定义:作用域就是一套规则,这套规则用于引擎如何进行查找变量以及在哪找到变量(可以看看之前我博客写的引擎和作用域之间的对话). 作用域分为词法作用域(也叫静态作用域)和动态作 ...
- JavaScript中的作用域,闭包和上下文
深入理解JavaScript中的作用域和上下文 很多语言当中都会有作用域的概念,它会给我们带来便利,偶尔也会有烦恼,只有清楚地理解和掌握了它,才能更好地为我所用,今天就带来这么一篇文章供大家参考. 介 ...
- JavaScript之词法作用域和动态作用域
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...
- javascript中关于作用域和闭包
列表项目 前言 学习了javascript已经很久了,关于这个语言中的这两个特性也是早已耳熟能详,但是在实际的使用的过程中或者是遇到相关的问题的时候,还是不能很好的解决. 因此我觉得很有必要深入的学习 ...
- javaScript中变量作用域
作用域是程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript采用词法作用域(lexical scoping),也就是静态作用域. 转载 ...
- JavaScript的变量作用域深入理解(转)
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整 ...
- 深入理解JavaScript的变量作用域(转)
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- JavaScript 函数(作用域以及闭包)
JavaScript 函数(作用域以及闭包) ・执行环境及作用域 执行环境定义了变量或函数有权访问的其他数据. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量或函数都保存在这个对象中, ...
最新文章
- onethink php7.1,海豚PHP开发框架下载
- 与技术无关的书单--你可以笑着说有些是“精神鸦片”
- 轮播图html_【技术篇前端】用html+css实现小米首页部分内容(含源码,不含轮播图)...
- 数据结构与算法:算法简介
- boost::hana::then用法的测试程序
- locate: database too small: /var/db/locate.databas
- 机器学习算法应用30篇(十一)-理解逻辑回归及二分类、多分类代码实践
- 算法3-------最长子序列和
- 学习 | egg.js 中间件和插件
- CStdioFile读写文件的问题
- 无法安装visual studio code,snap vscode has install-snap change in process
- 回文数例子,在10000以内每求出5个回文数,就进行换行操作.
- Excel文件加密的两种方式
- 全球最小的一款P2P软件——eMuleBT软件框架分析
- js 分行显示已选爱好
- RK3399 Android7.1修改安兔兔等读到的cpu最大频率为1.992GHz
- 十七、网上商城项目(6)
- 2022-2028全球与中国Oracle Bronto咨询服务市场现状及未来发展趋势
- eclipse自动关闭解决方案
- c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc
热门文章
- javascript常用代码大全
- mysql约束条件整型_MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增...
- 微型计算机的发展通常以为技术指标,计算机组成原理期末复习题.doc
- 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题
- asm冗余 oracle_oracle asm 磁盘管理什么场景该用什么样的冗余方式
- linux mysql insert_linux mysql怎么添加数据
- python excel 教程推荐_python对Excel按条件进行内容补充(推荐)
- 求列表最大元素不用max_python3实现从一个无序列表中求取连续元素之和中最大的和...
- ANSYS报错Accelerations are exceeding internal limit解决方法
- 并行处理的类型与CPU/GPU架构