JavaScript的作用域和上下文
作用域在函数定义时就已经确定了,执行上下文环境在函数调用时才确定。在全局作用域和函数作用域中会创建执行上下文环境(有闭包存在时,一个作用域存在两个上下文环境也是有的)。函数每调用一次都会产生一个新的执行上下文环境。但是处于活动状态的执行上下文环境只有一个,这是一个压栈出栈的过程。
执行上下文:函数每调用一次,都会产生一个新的执行上下文环境,因为不同的调用可能就有不同的参数。
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的作用域和上下文相关推荐
- JS运行过程,作用域和上下文的作用,自执行函数
两个作用域 函数定义时确定 1.全局作用域 2.函数作用域 作用:隔离变量,不同作用域下同名变量不会有冲突 JS中没有块级作用域 两个上下文(或称为词法环境) 执行过程中产生 1.全局上下文:一个JS ...
- JavaScript中的作用域,闭包和上下文
深入理解JavaScript中的作用域和上下文 很多语言当中都会有作用域的概念,它会给我们带来便利,偶尔也会有烦恼,只有清楚地理解和掌握了它,才能更好地为我所用,今天就带来这么一篇文章供大家参考. 介 ...
- JavaScript从作用域到闭包
目录 作用域 全局作用域和局部作用域 块作用域与函数作用域 作用域中的声明提前 作用域链 函数声明与赋值 声明式函数.赋值式函数与匿名函数 代码块 自执行函数 闭包 作用域(scope) 全局作用域 ...
- JavaScript词法作用域的简单介绍
by Michael McMillan 迈克尔·麦克米兰(Michael McMillan) JavaScript词法作用域的简单介绍 (An easy intro to Lexical Scopin ...
- 独家 | 图解BiDAF中的单词嵌入、字符嵌入和上下文嵌入(附链接)
作者:Meraldo Antonio 翻译:张玲 校对:吴金笛 本文约5200字,建议阅读15分钟. 本文重点讲解机器问答任务中常见机器学习模型BiDAF是如何利用单词.字符和上下文3种嵌入机制将单词 ...
- 再探Javascript词法作用域
写在前面的话:每个人都会犯错--有时候'孰能无过,过而能改,善莫大焉',有时候知道自己错了却没有机会更改.其实,错了并不仅仅是错了,做错了,除了及时改正和弥补之外,最重要的是为自己犯的错承担所有责任. ...
- Django 学习第十一天——中间键和上下文处理器
一.中间键的引入: Django中间件(Middleware)是一个轻量级.底层的"插件"系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. djang ...
- 浅谈JavaScript 函数作用域当中的“提升”现象
在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的. 例如 : message = "hello JavaScript ! " ...
- 深度学习核心技术精讲100篇(二十九)-基于内容和上下文的音乐推荐
前言 随着在线音乐商城及流媒体音乐服务的出现,数字音乐分发已经使得音乐触手可及.然而,面对突然出现的海量可收听内容,听众很容易面临信息过载的问题.因此,本次分享的主题音乐推荐系统,将为那些面临海量内容 ...
最新文章
- python 爬取图片_使用python爬取英雄联盟官方英雄皮肤图片
- php 二位数组随机,PHP多维数组 php打乱数组二维数组多维数组的简单实例
- mysql的存储过程基本使用
- 【Tools】gcc4.4升级到gcc4.8
- mysql主从备份及原理分析
- getContext() , getApplicationContext() , getBaseContext() and “this”的区别
- volatile与多线程
- nmon Analyser分析仪
- html——原生js与jquery创建元素节点区别
- 编译原理 自顶向下分析
- python django开发api_基于Django框架开发Restful api
- 记休产假前的一些杂想
- QT Icon设置异常
- Android 播放器 mov,Android 调用系统播放器
- 数据库的基本命令 创建数据库 创建表 插入数据
- 深度剖析未来网络服务模式 《云交换白皮书》一文全讲透
- JavaWeb专栏之(一):什么是JavaWeb?
- Grafana 显示某一时间点的总值
- js 数组(定义数组,数组长度,数组计算,元素类型转换)
- 真正解决layer弹层遮罩挡住窗体的问题