作用域在函数定义时就已经确定了,执行上下文环境在函数调用时才确定。在全局作用域和函数作用域中会创建执行上下文环境(有闭包存在时,一个作用域存在两个上下文环境也是有的)。函数每调用一次都会产生一个新的执行上下文环境。但是处于活动状态的执行上下文环境只有一个,这是一个压栈出栈的过程。

执行上下文:函数每调用一次,都会产生一个新的执行上下文环境,因为不同的调用可能就有不同的参数。

let a = 10, fn,       // 1、进入全局上下文环境bar = function(x) {let b = 5fn(x + b)     // 3、进入fn函数上下文环境
     }
fn = function(y) {let c = 5console.log(y + c)
}bar(10)                 // 2、进入bar函数上下文环境

首先(数字1注释),执行代码之前,首先创建全局上下文环境(活动状态)如下:

// 全局上下文环境
a: undefined
fn: undefined
bar: undefined
this: window

之后开始执行代码,代码到10行之前,上下文环境中的变量都在执行过程中被赋值如下:

// 全局上下文环境
a: 10
fn: function
bar: function
this: window

然后执行到bar(10) ,跳转到bar函数内部,执行函数体语句之前,在bar函数内会创建一个新的执行上下文环境如下,并且将bar执行上下文环境压栈。

// bar执行上下文环境
b: undefined
x: 10
arguments: [10]
this: window

然后执行到数字3注释那里,调用fn函数,执行函数体语句之前,会创建一个新的执行上下文环境如下,并且将fn执行上下文环境压栈。

// fn执行上下文环境
c: undefined
y: 15
arguments: [15]
this: window

在上边步骤中,fn执行完毕后,调用fn函数生成的fn上下文环境出栈,被销毁。然后bar执行完毕后,调用bar函数生成的上下文环境出栈,被销毁。然后剩下全局上下文环境,出栈销毁。具体步骤如下图:

作用域:JavaScript 采用的是词法作用域,即函数的作用域在函数定义的时候就决定了,在外部作用域无法访问内部作用域中的变量。

作用域链:如果要取得一个变量得值,首先会在当前的作用域中寻找,如果没有,就会到外层作用域中寻找,再没有在向外层的作用域中找,找到了就结束了,找不到就报异常了,就形成了作用域链。

每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。JavaScript的作用域在被执行之前已经创建,之后后再去执行时只需要按照作用域链去寻找即可。

自由变量:比如变量a,是在fn函数作用域使用,但是并没有在fn作用域声明,而是在别的作用域声明,这就是自由变量。

转载于:https://www.cnblogs.com/xjy20170907/p/11423292.html

JavaScript的作用域和上下文相关推荐

  1. JS运行过程,作用域和上下文的作用,自执行函数

    两个作用域 函数定义时确定 1.全局作用域 2.函数作用域 作用:隔离变量,不同作用域下同名变量不会有冲突 JS中没有块级作用域 两个上下文(或称为词法环境) 执行过程中产生 1.全局上下文:一个JS ...

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

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

  3. JavaScript从作用域到闭包

    目录 作用域 全局作用域和局部作用域 块作用域与函数作用域 作用域中的声明提前 作用域链 函数声明与赋值 声明式函数.赋值式函数与匿名函数 代码块 自执行函数 闭包  作用域(scope) 全局作用域 ...

  4. JavaScript词法作用域的简单介绍

    by Michael McMillan 迈克尔·麦克米兰(Michael McMillan) JavaScript词法作用域的简单介绍 (An easy intro to Lexical Scopin ...

  5. 独家 | 图解BiDAF中的单词嵌入、字符嵌入和上下文嵌入(附链接)

    作者:Meraldo Antonio 翻译:张玲 校对:吴金笛 本文约5200字,建议阅读15分钟. 本文重点讲解机器问答任务中常见机器学习模型BiDAF是如何利用单词.字符和上下文3种嵌入机制将单词 ...

  6. 再探Javascript词法作用域

    写在前面的话:每个人都会犯错--有时候'孰能无过,过而能改,善莫大焉',有时候知道自己错了却没有机会更改.其实,错了并不仅仅是错了,做错了,除了及时改正和弥补之外,最重要的是为自己犯的错承担所有责任. ...

  7. Django 学习第十一天——中间键和上下文处理器

    一.中间键的引入: Django中间件(Middleware)是一个轻量级.底层的"插件"系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. djang ...

  8. 浅谈JavaScript 函数作用域当中的“提升”现象

    在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的. 例如 : message = "hello JavaScript ! " ...

  9. 深度学习核心技术精讲100篇(二十九)-基于内容和上下文的音乐推荐

    前言 随着在线音乐商城及流媒体音乐服务的出现,数字音乐分发已经使得音乐触手可及.然而,面对突然出现的海量可收听内容,听众很容易面临信息过载的问题.因此,本次分享的主题音乐推荐系统,将为那些面临海量内容 ...

最新文章

  1. python 爬取图片_使用python爬取英雄联盟官方英雄皮肤图片
  2. php 二位数组随机,PHP多维数组 php打乱数组二维数组多维数组的简单实例
  3. mysql的存储过程基本使用
  4. 【Tools】gcc4.4升级到gcc4.8
  5. mysql主从备份及原理分析
  6. getContext() , getApplicationContext() , getBaseContext() and “this”的区别
  7. volatile与多线程
  8. nmon Analyser分析仪
  9. html——原生js与jquery创建元素节点区别
  10. 编译原理 自顶向下分析
  11. python django开发api_基于Django框架开发Restful api
  12. 记休产假前的一些杂想
  13. QT Icon设置异常
  14. Android 播放器 mov,Android 调用系统播放器
  15. 数据库的基本命令 创建数据库 创建表 插入数据
  16. 深度剖析未来网络服务模式 《云交换白皮书》一文全讲透
  17. JavaWeb专栏之(一):什么是JavaWeb?
  18. Grafana 显示某一时间点的总值
  19. js 数组(定义数组,数组长度,数组计算,元素类型转换)
  20. 真正解决layer弹层遮罩挡住窗体的问题

热门文章

  1. css 控制div高度自适应浏览器的高度
  2. SharePoint 调查列表的自定义错误页面
  3. java基础—Properties集合
  4. Leetcode-5199 Smallest String With Swaps(交换字符串中的元素)
  5. P2388 阶乘之乘
  6. 谈谈Groovy闭包
  7. Java内功修炼系列一工厂模式
  8. [luoguP1005] 矩阵取数游戏(DP + 高精度)
  9. AngularJS日期格式化
  10. HDU 4359 Easy Tree DP? 组合数学+动归