目录

一、作用域

1. 全局作用域(Global Scope)

2. 局部作用域(Local Scope) 

3. 块级作用域

二、作用域链

三、预解析


一、作用域

作用域是可访问的变量的集合。在JavaScript中,作用域为可访问变量,对象,函数的集合,它分为局部作用域和全局作用域。作用域决定了这些变量的可访问性(可见性)。

1. 全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域.

var outValue = "最外层变量"; //最外层变量
function outFun() { //最外层函数var inValue = "内层变量";function innerFun() { //内层函数console.log(inValue );}innerFun();
}
console.log(outValue ); //最外层变量
outFun(); //最外层函数
console.log(inValue );  //inValue is not defined  内层变量是局部作用域,函数以外访问不到他
innerFun();   //innerFun is not defined  内层函数是局部作用域,函数以外访问不到他

(2)所有末定义直接赋值的变量自动声明为拥有全局作用域

function outFun2() {value1= "未定义直接赋值的变量";var value2= "内层变量2";
}
outFun2();//要先执行这个函数,
console.log(value1); //未定义直接赋值的变量
console.log(value2); //value2not defined  内层变量2是局部作用域,函数以外访问不到他

注意点:如果在函数中定义变量时,如果不添加var关键字, 这个变量是一个全局变量

<script>function test() {// 企业开发千万不要这么写num = 123;console.log(num);}test();console.log(num);
</script>

(3)所有window对象的属性拥有全局作用域

2. 局部作用域(Local Scope) 

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域

3. 块级作用域

ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let 和 const 来体现。
        块级作用域所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
在一个函数内部,在一个代码块(由一对花括号包裹)内部

二、作用域链

  • JavaScript代码中至少有一个作用域, 即全局作用域。
  • 凡是代码中有函数,那么这个函数就构成另一个作用域。
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
  • 将这样的所有的作用域列出来,可以形成的结构就称之为作用域。
<script>var num = 123; // 0级作用域链function test() { // 0级作用域链var num = 666; // 1级作用域链console.log(num);function demo() { // 2级作用域链var num = 777;console.log(num);}demo();}test();console.log(num);
</script>

三、预解析

  1. JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。
  2. JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程,代码执行过程
  3. 预解析过程:

a、把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。

b、把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。

c、先提升var,在提升function。

案例1

<script>console.log(num); // undefinedvar num = 123;// 把变量的声明提升到当前作用域的最前面var num;console.log(num);num = 123;
</script>

案例2

<script>test();function test() {console.log("hello world");}
</script>
<script>// 把函数的声明提升到当前作用域的最前面function test() {console.log("hello world");}test();alert(test);
</script>

预解析练习

    var num = 123;fun();function fun() {console.log(num);var num = 666;}/*var num;function fun() {var num;console.log(num);num = 666;}num = 123;fun();*/
    var a = 666;test();function test() {var b = 777;console.log(a);console.log(b);var a = 888;}/*var a;function test() {var b;var a;b = 777;console.log(a);console.log(b);a = 888;}a = 666;test();*/

注意点:变量和函数同名时, 函数的优先级高

<script>console.log(num);function num() {console.log("hello world");}var num = 666;console.log(num);/*function num() {console.log("hello world");}var num;console.log(num);num = 666;console.log(num);*/
</script>

 不同方式定义函数区别

预解析时提升的方式不同

<script>// 1.函数声明test();function test() {console.log("你好,世界");}// 2.函数表达式demo(); // 报错var demo = function () {console.log("www.it666.com");}/*function test() {console.log("你好,世界");}var demo;test();demo();demo = function () {console.log("www.it666.com");}*/
</script>

【经典面试题】JS作用域、作用域链、预解析相关推荐

  1. this指向-作用域、作用域链-预解析 变量提升-Vue组件传值 父子 子父 非父子-Vue数据双向绑定原理

    目录 this指向 作用域.作用域链 预解析 变量提升 Vue组件传值 父子 子父 非父子 Vue数据双向绑定原理 1.this指向 函数的this指向 看调用.不看声明 (1)普通函数调用 ①函数名 ...

  2. 内置对象的API Array数组对象 String字符串对象 json字符串 JSON对象 js作用域及变量预解析 引用类型与值类型区别 共享引用 基本包装类型 数组去重

    01-内置对象的API a.Date对象获取时间 b.Array对象数组加工 c.String对象字符串加工 d.json字符串的语法格式 e.JSON对象的字符串与对象转换应用 02-JS作用域 a ...

  3. JS函数声明和预解析的理解

    JS函数声明方法 今天看到了一个自己关注了的大神给我回了私信,觉得自己仿佛摸到了大神的裤腿,哈哈,而且人还特别好,居然会给小菜鸟回私信,特别开心呀,一个菜鸟的小激动,言归正传啦 1.最为常见的函数声明 ...

  4. javascript之作用域与预解析

    js之预解析 在谈js的预解析之前,先看一段c++程序 #include <iostream> using namespace std;void useGreet(){greet(); } ...

  5. 前端经典面试题(一)-李游Leo-专题视频课程

    前端经典面试题(一)-89人已学习 课程介绍         在鱼龙混杂的前端行业中,面试一直是一门非常重要的课程,尤其是笔试题. 本课程精选了22道出现率颇高的经典的前端面试题,从浅入深的了解认知这 ...

  6. 轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

    hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...

  7. 前端学习记录27-JavaScript-(作用域、预解析、自定义对象)

    前端学习记录27-JavaScript-作用域.预解析.自定义对象 作用域 全局作用域 局部作用域(函数作用域) 变量作用域 全局变量 局部变量 作用域链 预解析 变量预解析 函数预解析 预解析经典面 ...

  8. js变量提升_学习笔记:JS中的作用域和预解析

    知识总结:谢静贤.汤昊 在javascript中作用域是非常重要的,本文将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家 ...

  9. JavaScript中的作用域、作用域链、预解析

    作用域: /* 变量--->局部变量和全局变量 * 作用域:就是变量的适用范围 * 局部作用域和全局作用域 * js中没有快级作用域---一对括号中定义的变量,这个变量可以在大括号外面使用 * ...

最新文章

  1. PAT甲级1069 The Black Hole of Numbers:[C++题解]模拟、6174
  2. php7+apache2.4配置
  3. 安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...
  4. XML模板解析————Dom4j解析xml案例分析
  5. java - 菱形输出
  6. 快速找出Linux服务器上不该存在恶意或后门文件
  7. python 判断数字连续_零基础如何自学python? 这些知识点是你进阶的必经之路
  8. 验证码识别,打码平台
  9. 哲学家就餐问题python_无聊的哲学家进餐问题
  10. 英寸和厘米的换算python_OJ实例:厘米换算英尺英寸
  11. 免费网页设计学习课程,视频以及设计工具大全,网页设计不过如此!!!
  12. 让cocos2d-x 3.0读取cocostudio中的csb文件
  13. 心灵捕手——走进内心世界
  14. IOS上的monkey测试探索(一)
  15. 共轭复数,共轭根式,共轭矩阵,共轭方向,共轭方向法,共轭梯度法,共轭分布,共轭函数,傅里叶变换的共轭对称
  16. 用java计算输入工资计算税收_标准作业
  17. 华中科技大学计算机考博真题,2010年华中科技大学计算机考博试题
  18. 已知旋转中心和旋转角度,获得旋转之后的一组点坐标
  19. layui的确认弹出层的玩法
  20. 社群营销运营分类包括哪些内容

热门文章

  1. Python视频制作 MoviePy视频效果vfx函数
  2. 拼题A L1-028
  3. 拼题A 基础篇13 查询水果价格
  4. iPad服务器怎样修复,五个解决我的iPad无法打开的解决方案
  5. 7 Ways To Free Up Hard Disk Space On Windows
  6. TMS320F28335外部中断总结
  7. kali下Eternalblue攻击win7
  8. 《文本上的算法——深入浅出自然语言处理》读书笔记:第6章 搜索引擎是什么玩意儿
  9. 怎样在电脑桌面上显示此计算机,电脑win10系统的桌面上怎么显示“此电脑”图标...
  10. 电子顺磁共振谱(EPR,ESR)