稳扎稳打JS——执行上下文

上下文环境的初始化在代码执行前完成

  • JS有三种作用域:全局作用域、函数作用域、eval作用域(不常用,不做介绍)。
  • 在JS代码执行前,首先会对这三种作用域进行上下文环境的准备工作,准备内容如下:
    1. 全局作用域的上下文准备工作
      • 将全局变量设为undefined
      • 将函数表达式的值设为undefined
      • 为函数声明直接赋值
      • 将window对象赋给this
    2. 函数作用域的上下文准备工作
      • 确定自由变量的作用域
      • 为函数的参数和arguments对象赋值
      • 将局部变量的值设为undifined
      • 将函数表达式的值设为undifined
      • 为函数声明直接赋值
//将全局变量的值设为undefined
console.log(a); //undefined
var a = 1;

//将window对象赋给this
console.log(this);

//将函数表达式的值设为undefined
console.log(fn1);//undefined
var fn1 = function(){
    //……
}

//为函数声明直接赋值
console.log(fn2); //输出函数的代码
function fn2(){
    //……
}

//函数作用域
function fn3(b,c){
    //确定自由变量的作用域
    console.log(a);

    //为局部变量赋上undefined
    console.log(x);//undefined
    var x = 123;

    //为函数的参数赋值
    console.log(b,c); //2,3

    //为arguments赋值
    console.log(arguments); //[2,3]
}

fn3(2,3);
  • 函数作用域中this的是在JS运行时才能确定,而全局作用域中的this在准备上下文环境的时候就确定了(window)。
  • 定义函数有两种方法:函数声明式定义、函数表达式定义,如下所示:
//函数声明式定义
function fn(a,b){
    //……
}

//函数表达式定义
var fn = function(a,b){
    //……
}
  • 两者区别如下:
    • 若采用函数声明式定义,函数调用语句和函数声明语句的先后次序无关。 因为在代码运行前的准备上下文环境过程中,函数的初始化已经完成,所以运行时无论函数调用语句在哪儿,JS编译器都能调用这个函数。
    • 若采用函数表达式来定义函数,则函数定义一定要在函数调用语句之前! 因为在这种方式中,函数的初始化是在运行时完成,在代码运行前只是将undefined赋给函数变量。因此在这种情况下,函数调用语句必须在函数定义后。
  • JS中作用域只有三种:全局作用域、函数作用域、eval作用域。除此之外就没有作用域了!如:for、if、while等都不是独立的作用域! 因此在里面定义的局部变量都属于其所属的外层作用域。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

【Java学习笔记之五】java数组详解

数组 概念 同一种类型数据的集合。其实数组就是一个容器。 数组的好处 可以自动给数组中的元素从0开始编号,方便操作这些元素...

2718
来自专栏WD学习记录

js学习2016-8-16

    当一个函数被保存为对象的一个属性时,我们称它为一个方法。如果调用表达式包含一个提取属性的动作,(即我们讲解对象时所说的.操作符),那么它就被当做一个方法...

601
来自专栏章鱼的慢慢技术路

C语言中的字符串处理库函数介绍与实现

752
来自专栏搞前端的李蚊子

JS中const、var 和let的区别

今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章。主要内容是:js中三种定义变量的方式const, var, let的区别。 1.const定义...

2586
来自专栏青枫的专栏

集合的toString()方法源码解析

为什么c输出的不是地址值呢?   A:Collection c = new ArrayList();     这是多态,所以输出c的toString()方...

483
来自专栏mySoul

C++命名空间

652
来自专栏程序员的碎碎念

php Array数组知识总结

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量...

3527
来自专栏C语言及其他语言

【编程经验】共用体的定义和使用

在 C 语言中,允许几种不同类型的变量存放到同一段内存单元中,也就是使用覆盖技术,几个变量互 相覆盖。这种几个不同的变量共同占用一段内存的结构,被称为共用体类型...

742
来自专栏算法与数据结构

CC150--原串翻转

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。

512
来自专栏吾爱乐享

java之学习正则split分割的典型案例

1144

扫码关注云+社区