作用域即变量/函数可以被访问的区域。

全局作用域

{} 和函数外的区域为全局作用域。

  • 全局作用域中的声明的变量是全局变量,在页面的任意的部分都可以访问。
  • 全局作用域中无法访问函数作用域的变量
  • 全局作用域在页面打开时创建,在页面关闭时销毁。
  • 全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,由浏览器创建,可以直接使用,全局变量是window对象的属性,函数是window对象的方法。
function foo() {var a = b = 100; // 连续赋值
}foo();console.log(window.b); // 打印 100
console.log(window.a); // 打印 undefined
console.log(a); // 报错 Uncaught ReferenceError: a is not defined

var a = b = 100 这行连续赋值的代码等价于 var a = (b = 100),其执行顺序是:

  1. 先把 100 赋值给 b;
  2. 再声明变量 a
  3. 再把 b 的值赋值给 a
  • b 是未经声明的变量就被赋值了,属于 window.b;
  • a 的作用域仅限于 foo() 函数内部,不属于 window;

块作用域

{} 中为块作用域

  • 变量只在代码块中有效;

ES5本身不提供块级作用域,通常使用立即调用函数表达式实现

(function () {var block_scoped=0;
}());
console.log(block_scoped); //引用错误

ES6中,使用 let 和 const 实现块级作用域

let a =1
if(a===1) {let b = 2
}
console.log(b); // Uncaught ReferenceError: b is not defined

函数作用域

函数内的区域为函数作用域(即 function 中 { } 内的部分)

函数作用域的原理

执行期上下文:当函数执行时,会创建一个执行期上下文的内部对象。每调用一次函数,就会创建一个新的上下文对象,他们之间是相互独立的。当函数执行完毕,它所产生的执行期上下文会被销毁。

在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用(就近原则)。如果没有则向上一级作用域中寻找,直到找到全局作用域;如果全局作用域中依然没有找到,则会报错ReferenceError。

函数作用域的特点

  • 函数作用域中可以访问到全局作用域的变量,如window.a(全局作用域和函数作用域都定义了变量a时)
  • 全局作用域无法访问函数内定义的变量
  • 函数中,使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
  • 函数中,没有var声明的变量都是全局变量,而且并不会提前声明。
  • 函数中,函数声明也会在函数中所有的代码执行之前执行
    var a = 1;function foo() {console.log(a);a = 2;     // 此处的a相当于window.a}foo(); // 打印结果是1console.log(a);   //打印结果是2

定义形参就相当于在函数作用域中声明了变量。

    function fun6(e) { // 这个函数中,因为有了形参 e,此时就相当于在函数内部的第一行代码里,写了 var e;console.log(e);}fun6();  //打印结果为 undefinedfun6(123);//打印结果为123

模块作用域

ES6新增语法,每个js文件都是一个模块,每个模块中的区域即模块作用域,其他文件要使用模块中的变量/函数,必须对外导出模块中的变量/函数,并在目标文件中引入。

图解—JS调用栈

JS 【详解】作用域相关推荐

  1. Grunt学习笔记002---Gruntfile.js详解

    Gruntfile.js详解 使用yeomen新建一个项目,里面会自动帮你创建一个完整项目的全部目录,这里针对新建出来的Gruntfile.js做一下简单说明,用作以后参考使用,由于还是菜鸟,很多东西 ...

  2. php Immutable,Immutable.js详解

    这次给大家带来Immutable.js详解,使用Immutable.js的注意事项有哪些,下面就是实战案例,一起来看一下. Immutable.js在react + router + redux项目中 ...

  3. 微信小程序学习:(二)app.js及index.js详解

    微信小程序学习:(二)app.js及index.js详解 项目地址:https://github.com/leoricding/- 在用ide创建小程序项目时,系统默认为我们创建了一个hellowor ...

  4. nodejs app.js详解

    app.js代码及其解释 //这里主要是引用所必须要的模块,当然,这些模块是需要使用"npm install 模块名"安装的 //模块依赖 var express = requir ...

  5. JS详解 | 对象 事件 节点 | 系统性学习 | 无知的我费曼笔记

    无知的我正在复盘js- 文章目录 JavaScript 1 常用命令 输出语句 转换为字符串 得到变量类型 1 获取元素对象 1.1 H5新增获取元素对象 1.2 直接获取特殊元素对象 2 事件三要素 ...

  6. prototype.js详解

    prototype.js是什么? 万一你没有使用过大名鼎鼎的prototype.js,那么让我来告诉你,prototype.js是由Sam Stephenson写的一个javascript类库.这个构 ...

  7. jquery.validate.js 详解

    jquery下载地址:https://jquery.com/download/ jquery.validate.js下载地址:https://cdnjs.com/libraries/jquery-va ...

  8. lazyload.js详解

    简介 lazyload.js用于长页面图片的延迟加载,视口外的图片会在窗口滚动到它的位置时再进行加载,这是与预加载相反的. 优点: 它可以提高页面加载速度: 在某些情况清晰它也可以帮助减少服务器负载. ...

  9. jquery.lazyload.js详解

    简介 lazyload.js用于长页面图片的延迟加载,视口外的图片会在窗口滚动到它的位置时再进行加载,这是与预加载相反的. 优点: 它可以提高页面加载速度: 在某些情况清晰它也可以帮助减少服务器负载. ...

  10. node.js详解Http服务器

    概念:Node.js提供了http模块.其中封装了一个高效的HTTP服务器和一个建议的HTTP客户端.    http.server是一个基于事件的HTTP服务器.内部有C++实现.接口由JavaSc ...

最新文章

  1. 《研磨设计模式》chap18 状态模式state(3)应用到场景
  2. X509Certificate2 本地正常,放到线上内部错误
  3. spring mvc 提示_Spring BootHibernate提示
  4. 在崩溃或断电后测试Lucene的索引耐久性
  5. 计算机与人脑_人脑和计算机相比,谁具有更强的能力?听完科学家的解释恍然大悟...
  6. zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤三配置SDK)
  7. 磁盘IO单线程顺序写时最快的,如果多线程写,磁盘的磁头要不断重新寻址,所以写入速度反而会慢...
  8. 怎么估算空间利用率?新研发传感器分分钟搞定!
  9. 更新一些CAD中比较容易混淆的概念
  10. Tkinter教程(每天半小时,3天彻底掌握Tkinter)day1
  11. 基于AST抽象语法树的SQL注入检测 (2) -- 每周小结(01-02~01-08) - .Little Hann
  12. python发送email
  13. 使用win10自带虚拟光驱打开ISO镜像文件
  14. 钙钛矿型复合氧化物高熵陶瓷/过渡金属碳氮化物高熵陶瓷/固体氧化物燃料电池(SOFC)材料
  15. 《UNIX环境高级编程(第3版)》
  16. 基于javaweb的私人牙科诊所病历管理系统(java+jsp+css+javascript+mysql)
  17. js纯原声实现贪吃蛇小游戏
  18. PHP 将amr音频文件转换为mp3格式
  19. Unity游戏排行榜的制作与优化
  20. i5配置的计算机主机功耗,电脑配置电源多大功率好呢?

热门文章

  1. git、gitlab+jenkens版本控制的安装、升级与灾备
  2. Java Web项目中使用Freemarker生成Word文档
  3. 树莓派源码安装glib
  4. 虚拟机共享计算机的网络连接,Parallels Desktop如何共享网络 Mac与虚拟机共享网络设置教程...
  5. 使用Python开发一个恐龙跳跳小游戏,玩起来
  6. Android虚拟化
  7. 干货来袭!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第3天)概率分析篇:条件概率、全概率与贝叶斯公式
  8. html怎么实现聊天界面设计,纯css制作仿微信聊天页面
  9. 智能窗帘传感器c语言程序,基于单片机的智能窗帘控制系统设计(附程序代码)
  10. 内网安全-常见横向移动总结