通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

JavaScript(es6前)中的作用域有两种:

  • 全局作用域
    作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件。

  • 局部作用域(函数作用域)
    作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。

 js没有块级作用域

  • 块作用域由 { } 包括。

  • 在其他编程语言中(如 java、c#等),在 if 语句、循环语句中创建的变量,仅仅只能在本 if 语句、本循环语句中使用,如下面的Java代码:

java有块级作用域:

if(true){int num = 123;system.out.print(num);  // 123
}
system.out.print(num);    // 报错

以上java代码会报错,是因为代码中 { } 即一块作用域,其中声明的变量 num,在 “{ }” 之外不能使用;而与之类似的JavaScript代码,则不会报错:

Js中没有块级作用域(在ES6之前)

if(true){var num = 123;console.log(123); //123}console.log(123);   //123

变量的作用域

在JavaScript中,根据作用域的不同,变量可以分为两种:

全局变量

在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。

  • 全局变量在代码的任何位置都可以使用

  • 在全局作用域下 var 声明的变量 是全局变量

  • 特殊情况下,在函数内不使用 var 声明的变量也是全局变量(不建议使用)

局部变量

在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)

  • 局部变量只能在该函数内部使用

  • 在函数内部 var 声明的变量是局部变量

  • 函数的形参实际上就是局部变量

全局变量和局部变量的区别

  • 全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存

  • 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间

作用域链

只要是代码都一个作用域中,写在函数内部的局部作用域,未写在任何函数内部即在全局作用域中;如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;根据在**[内部函数可以访问外部函数变量]**的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链

作用域链:采取就近原则的方式来查找变量最终的值。

var a = 1;
function fn1() {var a = 2;var b = '22';fn2();function fn2() {var a = 3;fn3();function fn3() {var a = 4;console.log(a); //a的值 ?console.log(b); //b的值 ?}}
}
fn1();

JS作用域 , 作用域链相关推荐

  1. 1月8日学习内容整理:JS的作用域和作用域链

    补充: 对于编译型语言,是编译一次生成可执行文件来执行多次:对于解释型语言,始终都是编译一次执行一次 python编译时要看有没有赋值操作,没有的话就不编译任何内容:若有赋值操作,才会开辟内存空间,把 ...

  2. js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象

    js 闭包作用域和作用域链 最近,我们想创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系. 最初,我们只是在领域类中引入依赖关系,但这使得无法在测试中控制其值 ...

  3. 【金三银四】 一文弄懂 js 数据类型、堆栈内存、作用域(链)、闭包知识拓展 (一)

    引言 对答如流系列篇,关于基本数据类型.堆栈内存.作用域作用域链.闭包 大家好,这里是lionLoveVue,基础知识决定了编程思维,学如逆水行舟,不进则退.金三银四,为了面试也还在慢慢积累知识,Gi ...

  4. JS中作用域以及变量范围

    变量作用域 js作为一门脚本语言,他与c,java这些语言是不相同的. 全局变量 在js中声明全局变量,有下面几种方式: 1.在函数外通过var来声明. var test ="hello&q ...

  5. PHP中的__toString方法(实现JS里的链式操作)

    _toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...

  6. 怎么理解js的原型链继承?

    前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...

  7. js的原型链简单理解

    js的原型链 首先,在将js的原型链之前我们先来说一下什么是原型,当我们生成一个普通对象x的时候,这个x会有一个隐藏属性x._proto_,这个属性会指向Object.prototype也就是 x._ ...

  8. js的作用域链,原型链,以及闭包函数理解

    代码一: this.number = 10 function a() {this.number = 20 } a.prototype.init = () => console.log(this. ...

  9. 如何理解JS中作用域和作用域链

    1.背景介绍 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两 ...

最新文章

  1. Exchange Server2013 系列九:常规配置
  2. gettext()方法输出空白_如何将文档内容输出为无水印图片?超简单的操作方法看这里...
  3. 考研【复试技巧】如果复试时太紧张,遇到不会的问题只能凉了吗?这些技巧收下!
  4. HTML5培训分享:HTML5全栈工程师是什么?
  5. wxWidgets:wxPaintEvent类用法
  6. 知乎首页 粒子效果 动态背景
  7. 深度之眼 | 《如何高效度论文》笔记
  8. 代码生成利器-NCodeGenerate 教程(2) NCodeGenerate的代码公用之一
  9. 使用python自动发送QQ消息
  10. 北航机械学院计算机制图,北航《机械制图》在线作业一(含答案)
  11. 文献总结--水印图像文献调研
  12. 服务器cpu e系列和x系列,英特尔至强cpu,x系列和e系列哪个更好?
  13. L2、L3协议开发之以太网交换机基础
  14. java pdf 签名 修改_java – 替换PDF中的签名内容
  15. 365天深度学习训练营-第P7周:咖啡豆识别
  16. html 萤火虫特效,jquery萤火虫飞舞动画特效插件
  17. 2D游戏开发 - SkyGameEngine2d坐标系
  18. 微信android字体颜色,如何用微信打出颜色各异的字
  19. 年会活跃微信群小游戏有哪些?塔防小游戏经典玩法讲解
  20. 树莓派 Raspberry Pi 安装视频播放软件-omxplayer 并配置全屏播放

热门文章

  1. 单片机C语言实现dc到ac的转换,单相AC-DC转换电路精要.doc
  2. 如何在PowerPoint中使用水印
  3. TierPoint公司计划在塔尔萨建设另一个数据中心
  4. sdcms IIS7 windows server 2008 配置后,无法修改模板页面
  5. UI设计师常去的国外 UI设计素材网站有哪些?
  6. Excel 自定义函数按单元格背景颜色/字体颜色实现计数或求和
  7. ksu7对讲机调频软件_对讲机
  8. 软件需求工程 高校教学平台 需求变更控制文档
  9. 【笔记总结】高中英语——其一:定语从句
  10. 计算机简介、电脑常用快捷键、DOS命令、java环境搭建