作用域

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 环境和作用域的更多相关文章

  1. 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域

    × 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...

  2. 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系

    本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...

  3. 深入理解javascript中执行环境(作用域)与作用域链

    深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...

  4. 【原】javascript执行环境及作用域

    最近在重读<javascript高级程序设计3>,觉得应该写一些博客记录一下学习的一些知识,不然都忘光啦.今天要总结的是js执行环境和作用域. 首先来说一下执行环境 一.执行环境 书上概念 ...

  5. Javascript高级程序设计——执行环境与作用域

    Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...

  6. JavaScript之一: 闭包、执行环境、作用域链

    这是大虾的第一篇博文,大虾试图用最直白的语言去描述出所理解的东西,大虾是菜鸟,水平有限,有误的地方希望路过的朋友们务必指正,谢谢大家了. 从读书时代一路走来,大虾在学习的时候逐渐喜欢上了去追寻根源,这 ...

  7. 从头开始学JavaScript (九)——执行环境和作用域

    原文:从头开始学JavaScript (九)--执行环境和作用域 一.执行环境:定义了变量或者函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有与之关联的变量对象. 变量对象:保存着环境中 ...

  8. 《JavaScript高级程序设计》读书笔记 ---执行环境及作用域

    执行环境及作用域 执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自 ...

  9. javascript基础进阶——执行环境及作用域链

    概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...

随机推荐

  1. JavaScript中call和apply方法的使用

    acvaScript中的call()方法和apply()方法,在某些时候这两个方法还确实是十分重要的.1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法.2. 相同点:这两 ...

  2. Python成长之路【第四篇】模块儿

    模块儿&包(* * * * *) 模块儿(modue)的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多 ...

  3. Python 语法1

    函数的定义: """ def 函数名(): 函数内容,函数内容, 函数内容,函数内容, """ ////////////////////// ...

  4. Python 3 Anaconda 下爬虫学习与爬虫实践 (2)

    下面研究如何让<html>内容更加“友好”的显示 之前略微接触的prettify能为显示增加换行符,提高可阅读性,用法如下: import requests from bs4 import ...

  5. 1077 Eight

    Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37738   Accepted: 15932   Special ...

  6. tomcat下服务启动失败原因

    Tomcat启动成功,输入网址后可以显示小黄猫界面,但是在Tomcat下的服务却启动不成功,显示404(以Jenkins为例,运用多种方式查看原因) 注:1.单启动Tomcat服务是可以启动成功的. ...

  7. SQA

    SQA 一.SQA过程 首先组成一个团队,遵循敏捷开发的原则,进行分工合作,为软件开发编造一个用例故事,画出相应的图,小组讨论合作后写代码,软件质量保证(SQA-Software Quality As ...

  8. mac安装brew简单方法

    安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...

  9. 安装vmware tools问题

    我爱破解的xp虚拟机,之前没有装vmware tools,用起来非常不方便.因此,决定安装,但安装时出现了一些问题,特此记录: * 点击虚拟机的安装VMWARE TOOLS ,出现错误提示: 虚拟机需 ...

  10. 动态改变Spring定时任务执行频率

    @Component@EnableSchedulingpublic class updateCronTask implements SchedulingConfigurer { public stat ...