执行上下文环境—JavaScript面向对象高级

#  执行上下文环境 #

**定义**:执行函数的时候,会产生一个上下文的对象,里面保存变量,函数声明和this。

**作用**:用来保存本次运行时所需要的数据

在产生执行上下文(执行上下文环境)时,浏览器会做以下三个准备工作:

1.提取var 声明的变量,并赋值为 undefined

2.提取声明式函数。

3.给this赋值,指向window或当前对象。

函数每执行一次都会产生一个执行上下文,

因为函数参数不同会有不同的计算结果,

## 全局上下文环境 ##

全局级别的代码,如多个script标签,一旦执行就会进入全局执行上下文环境

1.提取普通变量,如 var a  ,并赋值 a = undefined

2.提取声明式函数,function fn(){}

3.给 this 赋值,this指向window

## 局部上下文环境   ##

在函数调用的时候产生,每一次调用就会产生,调用完成后销毁(除闭包)。

1.提取普通变量,如 var a  ,并赋值 a = undefined

2.提取声明式函数,function fn(){}

3.给 this 赋值,this指向当前对象

4.给参数赋值

5.给arguments 赋值

6.自由变量的取值作用域,查找并赋值

自由变量:在当前作用域中未声明的变量,会去其上一级查找,直到window

arguments:是一个实参副本,与实参保持一致。

## 执行上下文栈 ##

**压栈 和 出栈**

压栈:函数未调用时只有全局上下文在执行,每次调用函数时会产生局部上下文,这就是压栈,也就是进栈。

出栈:函数调用完成后,就会出栈,会销毁本次调用的局部上下文环境

注意:若函数里面是多层函数嵌套,也会出现多层执行上下文的嵌套

压栈和出栈也是嵌套产生的

时间: 2024-11-03 03:31:36

执行上下文环境—JavaScript面向对象高级的相关文章

javascript执行上下文环境

今天,想对javascript的执行上下文环境做一个深入的理解.之前一直都有这打算的,但无奈忙着忙着就忘记了.今天看了一篇博客,对执行上下文环境的理解可以说是醍醐灌顶. 一.对一段代码的理解开始 在浏览器的控制台输入以下代码段: 这个结果说明,代码在一句句执行之前,浏览器已经做了一些准备工作,所以,后面两个都没有报错.下面再看一段代码: 这个结果说明,函数声明时,把整个函数赋值了,而函数表达式和变量一样,只是申明. 我们总结一下,在"准备工作"中完成了哪些工作: 变量.函数表达式--变

执行上下文环境

学习文章------①王福明的博客   ②汤姆大叔的博客 总结笔记 知识点: 1.执行上下文环境,简单地说就是在执行代码之前把所有变量拿出来赋值. 2.处于执行上下文栈最上面的为活动状态 全局上下文环境 准备工作 ①变量的声明(普通变量,函数表达式) ②函数声明 ③this的指向(例如:console.log(this)) 函数体上下文环境 重点:Ⅰ.函数是在定义的时候确定了自由变量的作用域,而不是在调用的时候 Ⅱ.函数每调用一次,就会产生一个上下文环境        Ⅲ.函数执行完之后,上下文

作用域和作用域链 —javascript面向对象高级

# 作用域和作用域链 # ## 1.作用域 ## 定义:函数声明时,会确定当前函数的作用域,所谓作用域就是作用的范围(地盘) 全局作用域: a. window是顶层对象,是一切函数,变量,对象的终点, b. 所以在全局范围内定义的函数或变量,它都是属于window对象的属性或方法. c. 其作用域范围是全局,任何地方均能调用. 局部作用域: a. 函数声明时,函数内部的作用域就是局部作用域, b. 在函数内部通过var 声明的变量 和 声明式的函数均是该函数的私有变量或函数, c. 一般情况下,

闭包 —JavaScript面向对象高级

# 闭包 # 我的理解:面试时,先说作用域链,再说闭包产生的原因,然后是垃圾回收GC,最后说闭包. a.一个函数内部声明的变量,就是它的私有变量. b.在javascript中特性中,函数是可以访问它所在作用域链的所有变量. c.但函数外部是不能直接访问函数内部的私有变量 D.通过函数内部再嵌套函数,子函数返回父函数的变量,就创建了一个闭包. 闭包的表现形式 模块化的本质:是通过函数的局部作用域特性来产生局部上下文来保存局部变量 1.函数作为返回值 function fn(){ var coun

JS的解析与执行过程(javascript面向对象一)

JS的解析与执行过程 全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. 一.全局环境中如何理解预处理 比如说下面的这段代码: var a = 1;//用var定义的变量,以赋值 var b;//用var定义的变量,未赋值 c = 3;//未定义,直接赋值 function d(){//用声明的方式声明的函数 console.log('hello'

继承性—javascript面向对象高级

## 继承性 ## js不是一门完全是面向对象的语言,它没有专门实现对象继承的机制,但是可以通过语法层面实现对象的继承,要实现继承可以通过以下几种方式实现继承. (这里也可以通过ES6中的class语法实现继承,更接近传统语言如java,请见我ES6新特性) 2.通过constructor实现传值. 3.类Class的概念:构造函数 通过构造函数产生的对象叫做实例.具备构造函数的所有属性 将公用的方法和属性,提取出来存到原型上 继承的几种方式 1.通过原型实现继承 function Father

this —JavaScript面向对象高级

# this的用法 # 重点: 谁调用就指向谁 //ES6新特性中,定义箭头函数  var fn = () =>{...} 这里面如果有this,是固化的,跟bind情形基本相似 1,取值:在函数真正被调用的时候确定,因为每次调用会有一个不同的上下文 var per1 = new Person('zhangsan',18) per1.sayHello() var per2 = new Person('lis',20) per2.sayHello() per1一调用就指向per1,per2一调用就

对象的概念——javascript面向对象高级

什么是对象? a.对现实事物的抽象     -面向对象是对现实事物的抽象 b.对数据的封装    -是对具体数据的封装,是一堆属性和方法的集合 对象的三大特征(封装.继承.多态) 1.封装性,是对属性和方法的封装 2.继承是将别人没有的,拿过来成为自己的就是继承,js里不具备特定的继承的机制,但是可以通过技术上实 3.多态,不同情况的不同表现形式.如某个方法,传一个参数和传多个参数,得到的结果不一样 ## 创建对象的四种方式 ## **  1.声明范式** // var obj = {} **2

原型和原型链 —javascript面向对象高级

原型 1.原型有什么用:js是用原型来实现继承 2.原型是:每一个对象都有其原型对象__proto__,这个原型对象指向构造它的构造函数的原型属性prototype. ## 一.函数和对象的关系 ## 1.函数是对象的一种,instanceof 可以判断 2.对象是函数创建的 ## 二.prototype 与 __proto__ ## 1.prototype是函数的一个属性,每一个函数都有protptype属性,这个值是一个对象,里面有一个constructor属性,指向它自己. 2.__pro