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作用域相关推荐

  1. web前端(HTML的CSS样式和JavaScript)

    HTML的CSS样式和JavaScript CSS CSS介绍 概念和作用 示例代码 CSS的规则和3种位置 CSS规则 CSS的位置 行内样式 内部样式 外部样式 三种样式的代码 CSS基本选择器( ...

  2. 深入理解JavaScript的变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  3. 你不知道的JavaScript之词法作用域

    词法作用域 总结一下作用域的定义:作用域就是一套规则,这套规则用于引擎如何进行查找变量以及在哪找到变量(可以看看之前我博客写的引擎和作用域之间的对话). 作用域分为词法作用域(也叫静态作用域)和动态作 ...

  4. JavaScript中的作用域,闭包和上下文

    深入理解JavaScript中的作用域和上下文 很多语言当中都会有作用域的概念,它会给我们带来便利,偶尔也会有烦恼,只有清楚地理解和掌握了它,才能更好地为我所用,今天就带来这么一篇文章供大家参考. 介 ...

  5. JavaScript之词法作用域和动态作用域

    作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...

  6. javascript中关于作用域和闭包

    列表项目 前言 学习了javascript已经很久了,关于这个语言中的这两个特性也是早已耳熟能详,但是在实际的使用的过程中或者是遇到相关的问题的时候,还是不能很好的解决. 因此我觉得很有必要深入的学习 ...

  7. javaScript中变量作用域

    作用域是程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript采用词法作用域(lexical scoping),也就是静态作用域. 转载 ...

  8. JavaScript的变量作用域深入理解(转)

    在学习JavaScript的变量作用域之前,我们应当明确几点:  a.JavaScript的变量作用域是基于其特有的作用域链的.  b.JavaScript没有块级作用域.  c.函数中声明的变量在整 ...

  9. 深入理解JavaScript的变量作用域(转)

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  10. JavaScript 函数(作用域以及闭包)

    JavaScript 函数(作用域以及闭包) ・执行环境及作用域 执行环境定义了变量或函数有权访问的其他数据. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量或函数都保存在这个对象中, ...

最新文章

  1. onethink php7.1,海豚PHP开发框架下载
  2. 与技术无关的书单--你可以笑着说有些是“精神鸦片”
  3. 轮播图html_【技术篇前端】用html+css实现小米首页部分内容(含源码,不含轮播图)...
  4. 数据结构与算法:算法简介
  5. boost::hana::then用法的测试程序
  6. locate: database too small: /var/db/locate.databas
  7. 机器学习算法应用30篇(十一)-理解逻辑回归及二分类、多分类代码实践
  8. 算法3-------最长子序列和
  9. 学习 | egg.js 中间件和插件
  10. CStdioFile读写文件的问题
  11. 无法安装visual studio code,snap vscode has install-snap change in process
  12. 回文数例子,在10000以内每求出5个回文数,就进行换行操作.
  13. Excel文件加密的两种方式
  14. 全球最小的一款P2P软件——eMuleBT软件框架分析
  15. js 分行显示已选爱好
  16. RK3399 Android7.1修改安兔兔等读到的cpu最大频率为1.992GHz
  17. 十七、网上商城项目(6)
  18. 2022-2028全球与中国Oracle Bronto咨询服务市场现状及未来发展趋势
  19. eclipse自动关闭解决方案
  20. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

热门文章

  1. javascript常用代码大全
  2. mysql约束条件整型_MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增...
  3. 微型计算机的发展通常以为技术指标,计算机组成原理期末复习题.doc
  4. 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题
  5. asm冗余 oracle_oracle asm 磁盘管理什么场景该用什么样的冗余方式
  6. linux mysql insert_linux mysql怎么添加数据
  7. python excel 教程推荐_python对Excel按条件进行内容补充(推荐)
  8. 求列表最大元素不用max_python3实现从一个无序列表中求取连续元素之和中最大的和...
  9. ANSYS报错Accelerations are exceeding internal limit解决方法
  10. 并行处理的类型与CPU/GPU架构