javascript数据类型(六)--- 函数对象之执行上下文

一、引入

1.1 变量声明提升

  通过var定义(声明)的变量, 在定义语句之前就可以访问到,其值为: undefined

var a = 3
function fn () {
    console.log(a)   //输出结果为undefined
    var a = 4
}
fn()

1.2 函数声明提升

  通过function声明的函数, 在之前就可以直接调用,其值为: 函数定义(对象)

console.log(b) //undefined  变量提升
fn2() //可调用  函数提升
// fn3() //不能  变量提升

var b = 3
function fn2() {
    console.log(‘fn2()‘)
}

var fn3 = function () {
    console.log(‘fn3()‘)
}

更多关于变量提升和函数提升的知识见https://www.cnblogs.com/echolun/p/7612142.html

二、执行上下文

  执行上下文是一个比喻的词,用于描述运行Javascript代码的环境。JavaScript的代码按位置可简单分为全局代码和函数(局部)代码。在JavaScript中,每次运行一些Javascript代码时,引擎都会创造一个全局执行上下文,当调用函数时,在执行函数体之前,JavaScript引擎会创建一个局部的执行上下文。

2.1 全局执行上下文

  执行全局代码的过程:

  1. 在执行全局代码前将window确定为全局执行上下文
  2. 对全局数据进行预处理
    • var定义的全局变量==>undefined, 添加为window的属性
    • function声明的全局函数==>赋值(fun), 添加为window的方法
    • this==>赋值(window)
  3. 开始执行全局代码

2.2 函数执行上下文

  执行局部(函数)代码的过程

  1. 在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象(虚拟的, 存在于栈中)
  2. 对局部数据进行预处理
    • 申明形参变量,并将实参变量的值赋值为形参变量,添加为执行上下文的属性
    • arguments==>赋值(实参列表), 添加为执行上下文的属性
    • var定义的局部变量==>undefined, 添加为执行上下文的属性
    • function声明的函数 ==>赋值(fun), 添加为执行上下文的方法
    • this==>赋值(调用函数的对象)
  3. 开始执行函数体代码

三、执行上下文栈

  在全局代码执行前, JS引擎就会创建一个栈来存储管理所有的执行上下文对象(栈结构不了解的自行查询资料)。

  • 在全局执行上下文(window)确定后, 将其添加到栈中(压栈)
  • 在函数执行上下文创建后, 将其添加到栈中(压栈)
  • 在当前函数执行完后,将栈顶的对象移除(出栈)
  • 当所有的代码执行完后, 栈中只剩下window

如下代码执行的过程中会出现的上下文栈的变化图所示:

//创建全局上下文,并将该全局上下文储存到上下文栈中var a = 10
var bar = function (x) {
    var b = 5
    foo(x + b)  //创建foo的局部上下文栈,并将该上下文对象存储到栈中,当函数foo执行完成后自动释放该执行上下文,跳到bar执行上下文中
} 

var foo = function (y) {   var c = 5 console.log(a + c + y) } bar(10) //创建bar的局部上下文对象,并将该上下文对象存储到栈中

试题:

查看如此代码,分析输出内容

console.log(‘gb: ‘+ i)
var i = 1
foo(1)
function foo(i) {
    if (i == 4) {
      return
    }
    console.log(‘fb:‘ + i)
    foo(i + 1) //递归调用: 在函数内部调用自己
    console.log(‘fe:‘ + i)
}
console.log(‘ge: ‘ + i)

答案:

gb: undefined
  fb: 1
  fb: 2
  fb: 3
  fe: 3
  fe: 2
  fe: 1
  ge: 1

原文地址:https://www.cnblogs.com/hebing0415/p/11632578.html

时间: 2024-11-14 12:51:52

javascript数据类型(六)--- 函数对象之执行上下文的相关文章

__x__(69)0926第十一天__ JavaScript 指定函数对象的 this 上下文对象

指定函数对象的 this 上下文对象 即调用函数对象的 .call() 或者 .apply() 方法 指定 this 指向指定的对象. function myFun(){ document.write("我是"+this.name); } var sun = {name:"孙悟空"}; var zhu= {name:"猪八戒"}; .call(); myFun.call(sun); // 我是孙悟空 .apply(); myFun.apply(z

2014年辛星完全解读Javascript第六节 对象

随着面向对象的普及,现在很多语言都在支持面向对象,Javascript也不例外,所谓对象,就是拥有属性和方法的数据.这里的属性其实就是变量,这里的方法,其实就是函数.但是Javascript的面向对象和其他编程语言还是有很大区别的. ************对象************* 1.Javascript中的对象的定义“属性的无序集合,每个属性存放一个初始值.函数或者对象”,也就是说,对象是没有额定顺序的值的数组. 2.Javascript中的对象一般可以分为本地对象.内置对象.宿主对象

JavaScript基本数据类型,函数对象,表,数组,字符串,函数调用

直接上代码了, 1 cc.Class({ 2 extends: cc.Component, 3 4 properties: { 5 6 }, 7 //JS基本数据_函数对象_表_数组_字符串_函数调用 8 onLoad:function () { 9 //基本数据类型 10 //1整数 2 小数 3 逻辑变量真/假 cc.log();进行打印 11 console.log(1); 12 console.log(2.0); 13 console.log(true); 14 15 /*1: var

深入理解JavaScript系列(11):执行上下文(Execution Contexts)

简介 从本章开始,我将陆续(翻译.转载.整理)http://dmitrysoshnikov.com/网站关于ECMAScript标标准理解的好文. 本章我们要讲解的是ECMAScript标准里的执行上下文和相关可执行代码的各种类型. 原始作者:Dmitry A. Soshnikov 原始发布: 2009-06-26 俄文原文:http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/ 英文翻译:Dmitry A.

278 执行上下文、执行上下文栈:变量提升与函数提升,执行上下文,执行上下文栈,全局执行上下文,函数执行上下文,练习题

变量提升与函数提升 变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined) 函数提升: 在函数定义语句之前, 就执行该函数 先有变量提升, 再有函数提升 变量声明提升.函数声明提升 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_变量声明提升.函数声明提升</title> &l

函数作用域与执行上下文

1.代码分类:全局代码和函数(局部代码) 代码分为编译(由JS编译器执行)阶段和执行(JS引擎执行)阶段.当代码被编译时,会创建相应的作用域,当代码被执行时,会创建相应的执行 上下文. 2.作用域:是在编译阶段就产生的,一整套函数标识符的访问规则,由函数声明时所在的位置决定. 作用:主要用于隔离变量,不同的作用域中变量名字可以相同 作用域链:多个上下级关系作用域形成的链,由下向上或由内向外.定义了变量的查找规则 3.执行上下文: 1)全局执行上下文:执行全局代码前将window确定为全局执行上下

Javascript的匿名函数与自执行

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 1 2 3 function double(x){        return 2 * x;       } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. 1 var double = new Function('x', 'return 2 * x;'); 第三种: 1

JavaScript学习系列之执行上下文与变量对象篇

一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 在上一篇文章中讲解了JavaScript内存模型,其中有提到执行上下文与变量对象的概念.对于JavaScript开发者来说,理解执行上下文与变量对象的基本理论知识,是理解闭包,原型链的关键所在(闭包与原型链会在接下来的文章中介绍).本篇文章就带你走进JavaScript的执行上下文与变量对象,由于本人才疏学浅,若有什么表述有误的地方,欢迎各位看官能够指点一二,在此不胜感激... 在阅读这边文章之前,默认您已经掌握了JavaScript的基

Javascript 执行上下文 context&amp;scope

执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下文. 3 当执行 eval()的时候,创建 一个 eval 执行上下文. # if,for,while 等块不会创建 execution context,从而不会创建 scope. 当js解释器开始工作的时候: 1 首先创建一个 执行上下文栈(后进先出) 2 接着创建一个 全局的执行上下文,并放入执