javascript 作用域详解
javascript 作用域详解
作用域理解:定义的变量、函数生效的范围。javascript 有全局作用域和函数作用域两种。注:es6实现let 块级作用域不是js原生的,底层同样是通过var实现的。如果想了解具体细节,请访问babel官方 对es6中let 进行解析。
执行上下文
范围:一段内或者一个函数内;
全局:函数声明、变量声明 。范围:;
函数:函数声明、变量声明、this、arguments。范围:一个函数内部;
函数、变量声明提升
foo(); //打印a var foo = 1; function foo (){ console.log(’a‘) }; console.log(foo); //1
//实际的执行顺序为
function foo(){ //函数声明优先于变量的声明 console.log("a"); } //var a ; 重复声明,这儿被省略了。 foo(); //打印a foo = 1; //给foo赋值为1 console.log(foo); //1
当js引擎执行一个 执行上下文代码块时,执行顺序为:
1.函数声明 function a(){};(函数优先) 注:let a = function (){}; 这是变量的声明和赋值,不是函数的声明。
2.变量声明 var a; 注:刚开始只对变量进行声明,没有进行赋值,如果 在赋值之前使用到这个变量 值为:undefined。
3.执行上下文为函数作用域时:确定this和arguments。
4.按照js单线程和异步策略依次执行 作用域中的代码。
我们习惯将 var a = 2; 看作一个声明,而实际上 JavaScript 引擎并不这么认为。它将 var a和 a = 2 当作两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。要注意避免重复声明,特别是当普通的 var 声明和函数声明混合在一起的时候,否则会引起很多危险的问题!
作用域链
自由变量:当前作用域没有定义的变量,但是上层作用域定义了,可以在此层作用域中使用的变量。
作用域链:当使用一个变量时候,先在自己的作用域里找,如果没有找到,再到父级作用域找,一直找到全局作用域,如果都没有找到即报错。
块级作用域
js无块级作用域,仅有全局作用域和函数作用域两种作用域。
ES6 通过对全局作用域的特殊实现,实现了js的块级作用域 let;
let 的生效范围为 { };
const 为定义常量。注:定义的常量的值存储的内存地址不可变动,值是可变的比如常量中定义的是数组 或者对象时候,可以通过数组或对象方法操作原数据,只要不重新赋值就没问题。
原文地址https://www.cnblogs.com/honkerzh/p/10566804.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【资料下载】深入Python与日志服务,玩转大规模数据分析处理实战系列直播第四讲
Python并发编程与实时大数据处理监控 直播时间:3月20日(周三)20:00—21:00 直播介绍: Python多线程、多进程编程该如何做?如何避开GIL?本节以日志服务消费组模型为例,介绍相关原理实践以及如何做实时大数据的处理与监控。 直播讲师:丁来强(成喆)——阿里高级技术专家,从事阿里云日志服务相关的产品与研发工作,擅长AIOps/SecOps的大数据分析平台构建与场景落地,擅长C++与Python语言等。PyCon历届讲师,曾经在中国PyCon2015、2016与2018分享过7场/6个不同议题,覆盖Jupyter扩展、大数据分析可视化、工作流调度、函数式、设计模式、Python核心语言等方面,广受好评。 欢迎加入python技术进阶钉群与大牛交流经验 ppt下载:https://yq.aliyun.com/downloa
- 下一篇
Spring Boot 2 - 使用CommandLineRunner与ApplicationRunner
本篇文章我们将探讨CommandLineRunner和ApplicationRunner的使用。 在阅读本篇文章之前,你可以新建一个工程,写一些关于本篇内容代码,这样会加深你对本文内容的理解,关于如何快速创建新工程,可以参考我的这篇博客: Spring Boot 2 - 创建新工程 概述 CommandLineRunner和ApplicationRunner是Spring Boot所提供的接口,他们都有一个run()方法。所有实现他们的Bean都会在Spring Boot服务启动之后自动地被调用。 由于这个特性,它们是一个理想地方去做一些初始化的工作,或者写一些测试代码。 CommandLineRunner 使用Application实现 在我们新建好工程后,为了简单我们直接使用Application类实现CommandLineRunner接口,这个类的注解@SpringBootApplication会为我们自动配置。 package cn.examplecode.sb2runner; import org.slf4j.Logger; import org.slf4j.LoggerFa...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境