JavaScript 环境和作用域
作用域
1. 全局环境
window: JS的全局执行环境,顶层对象。this指针在全局执行环境时就指向window。
console.log(this===window); //true
2. 局部环境
什么情况会具有局部环境?
答: function声明(包括常规声明,箭头函数,匿名函数)的花括号{}内部会形成局部环境。
let a = 1;
(()=>{let a = 2;})();
(function(){let a = 2;})();
function f1()
{
let a = 3;
}
f1();
局部环境有什么特征?
答: 局部环境是运行在全局环境下的一个独立环境,局部环境可以嵌套。
局部环境和全局环境的关系?
答: 局部环境可以通过作用域链访问递归上级局部环境和最终全局环境中的资源。
3. 作用域链
从当前环境的arguments对象开始,到包含该环境的下一个环境的所有变量,一直到全局环境的变量,形成一个作用域链。
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
console.log(this);
// 这里可以访问color、anotherColor 和tempColor
}
// 这里可以访问color 和anotherColor,但不能访问tempColor
swapColors();
}
// 这里只能访问color
changeColor();
如下图:
window
|__color
|__changeColor()
|__anotherColor
|__swapColors()
|__tempColor
注意:function内部不带类型的变量声明将会被定义到全局环境
function Fun(){
var a = 1;
b = 2;
}
Fun();
console.log(a);//not defined
console.log(b);//2
4. 没有块级作用域 VS 有块级作用域
块级作用域:由花括号{}所形成的作用域
- ES5以前没有块级作用域
- ES6使用let和const,则具有块级作用域特性
//a.js
var a = 1;
if(true)//if语句后的{}并不会形成块级作用域,其中的代码还是运行在顶级作用域
{
var a = 2;//变量覆盖
}
console.log(a);//2
//b.js
if(true)
{
var a = 1;//定义到全局
let b = 2;//块级内部有效
const c = 3;//块级内部有效
}
console.log(a); //1
console.log(b); //not defined
console.log(c); //not defined
//c.js
var a = 0;
(function fun1()
{
var a = 1;
let b = 2;
const c = 3;
})()
console.log(a); //0
console.log(b); //not defined
console.log(c); //not defined
5. 变量提升
变量提升:在指定作用域里,从代码顺序上看是变量先使用后声明,但运行时变量的 “可访问性” 提升到当前作用域的顶部,其值为 undefined ,没有 “可用性”。
函数提升:同理,但只有函数声明式才存在函数提升,匿名函数和函数引用不会
看个例子就清楚了:
var i = 5;
function func() {
console.log(i);//undefined
var i = 6;
console.log(i);//6
}
func();
//根据JS引擎的编译,实际上的代码运行如下
var i = 5;
function func() {
var i;
console.log(i);//undefined
i = 6;
console.log(i);//6
}
func();
//函数提升如下
console.log(f1()); //aa
console.log(f2); //undefined
function f1() {console.log('aa')}
var f2 = function() {}
JavaScript 环境和作用域的更多相关文章
- 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域
× 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...
- 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...
- 深入理解javascript中执行环境(作用域)与作用域链
深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...
- 【原】javascript执行环境及作用域
最近在重读<javascript高级程序设计3>,觉得应该写一些博客记录一下学习的一些知识,不然都忘光啦.今天要总结的是js执行环境和作用域. 首先来说一下执行环境 一.执行环境 书上概念 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
- JavaScript之一: 闭包、执行环境、作用域链
这是大虾的第一篇博文,大虾试图用最直白的语言去描述出所理解的东西,大虾是菜鸟,水平有限,有误的地方希望路过的朋友们务必指正,谢谢大家了. 从读书时代一路走来,大虾在学习的时候逐渐喜欢上了去追寻根源,这 ...
- 从头开始学JavaScript (九)——执行环境和作用域
原文:从头开始学JavaScript (九)--执行环境和作用域 一.执行环境:定义了变量或者函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有与之关联的变量对象. 变量对象:保存着环境中 ...
- 《JavaScript高级程序设计》读书笔记 ---执行环境及作用域
执行环境及作用域 执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自 ...
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
随机推荐
- .net下的缓存技术
1.为什么要缓存?缓存能解决的问题 1.1稳定性 同一个应用中,对同一数据.逻辑功能和用户界面的多次请求时经常发生的.当用户基数很大时,如果每次请求都进行处理,消耗的资源是很大的浪费,也同时造成系统的 ...
- 运维shell全部语法进阶
Linux运维之shell脚本进阶篇 一.if语句的使用 1)语法规则 1 2 3 4 5 6 7 8 9 if [条件] then 指令 fi 或 if [条件];then ...
- openstack之neutron配额调整
1. 前言 neutron在安装配置完成之后,openstack为了实现对所有tenant对网络资源的使用,针对neutron设置有专门的配额,以防止租户使用过多的资源,而对其他的tena ...
- 实际操作中遇到的问题--Django中查看已安装的包的相关命令
pip freeze --------查看已经安装的包 pip uninstall 安装包名 ---------卸载已安装的包 pip install 安装包名--------安装包
- django channle的使用
频道在PyPI上可用 - 要安装它,只需运行: 参照:https://channels.readthedocs.io/en/latest/introduction.html pip install ...
- aiohttp AppRunner的用法
参考廖雪峰的aiohttp教程,会出现两个DeprecationWarning, loop argument is deprecated Application.make_handler(...) i ...
- 锦囊9-if语句
[程序描述] 编写程序,通过使用 if...elif...else 语句判断数字是正数.负数或零: [程序分析] 正数.负数或零的判断非常简单,只需要判断这个数是否大于零,小于零或者等于零.由于判断的 ...
- win10磁盘/cpu占用100%问题
https://www.zhihu.com/question/27664545 https://www.zhihu.com/question/27664545 微软自己的解决办法 https://su ...
- java的基础语法(标识符 修饰符 关键字)
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...
- Java基于opencv—透视变换矫正图像
很多时候我们拍摄的照片都会产生一点畸变的,就像下面的这张图 虽然不是很明显,但还是有一点畸变的,而我们要做的就是把它变成下面的这张图 效果看起来并不是很好,主要是四个顶点找的不准确,会有一些偏差,而且 ...