`

js函数执行过程

 
阅读更多
var outerVar1="variable in global code";
function fn1(arg1, arg2){
    var innerVar1="variable in function code";
    function fn2() { return outerVar1+" - "+innerVar1+" - "+" - "+(arg1 + arg2); }
    return fn2();
}
var outerVar2=fn1(10, 20);

 

执行处理过程大致如下:
1. 初始化Global Object即window对象,Variable Object为window对象本身。创建Scope Chain对象,假设为scope_1,其中只包含window对象。
2. 扫描JS源代码(读入源代码、可能有词法语法分析过程),从结果中可以得到定义的变量名、函数对象。按照扫描顺序:
   2.1 发现变量outerVar1,在window对象上添加outerVar1属性,值为undefined;
   2.2 发现函数fn1的定义,使用这个定义创建函数对象,传给创建过程的Scope Chain为scope_1。将结果添加到window的属性中,名字为fn1,值为返回的函数对象。注意fn1的内部[[Scope]]就是 scope_1。另外注意,创建过程并不会对函数体中的JS代码做特殊处理,可以理解为只是将函数体JS代码的扫描结果保存在函数对象的内部属性上,在函 数执行时再做进一步处理。这对理解Function Code,尤其是嵌套函数定义中的Variable Instantiation很关键;
   2.3 发现变量outerVar2,在window对象上添加outerVar2属性,值为undefined;
3. 执行outerVar1赋值语句,赋值为"variable in global code"。
4. 执行函数fn1,得到返回值:
   4.1 创建Activation Object,假设为activation_1;创建一个新的Scope Chain,假设为scope_2,scope_2中第一个对象为activation_1,第二个对象为window对象(取自fn1的 [[Scope]],即scope_1中的内容);
   4.2 处理参数列表。在activation_1上设置属性arg1、arg2,值分别为10、20。创建arguments对象并进行设置,将arguments设置为activation_1的属性;
   4.3 对fn1的函数体执行类似步骤2的处理过程:
       4.3.1 发现变量innerVar1,在activation_1对象上添加innerVar1属性,值为undefine;
       4.3.2 发现函数fn2的定义,使用这个定义创建函数对象,传给创建过程的Scope Chain为scope_2(函数fn1的Scope Chain为当前执行上下文的内容)。将结果添加到activation_1的属性中,名字为fn2,值为返回的函数对象。注意fn2的内部 [[Scope]]就是scope_2;
   4.4 执行innerVar1赋值语句,赋值为"variable in function code"。
   4.5 执行fn2:
       4.5.1 创建Activation Object,假设为activation_2;创建一个新的Scope Chain,假设为scope_3,scope_3中第一个对象为activation_2,接下来的对象依次为activation_1、window 对象(取自fn2的[[Scope]],即scope_2);
       4.5.2 处理参数列表。因为fn2没有参数,所以只用创建arguments对象并设置为activation_2的属性。
       4.5.3 对fn2的函数体执行类似步骤2的处理过程,没有发现变量定义和函数声明。
       4.5.4 执行函数体。对任何一个变量引用,从scope_3上进行搜索,这个示例中,outerVar1将在window上找到;innerVar1、arg1、arg2将在activation_1上找到。
       4.5.5 丢弃scope_3、activation_2(指它们可以被垃圾回收了)。
       4.5.6 返回fn2的返回值。
   4.6 丢弃activation_1、scope_2。
   4.7 返回结果。
5. 将结果赋值给outerVar2

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JS 函数式编程指南 PDF

    纯函数的概念是指一个函数的输出仅仅依赖于输入的参数,而不依赖于外部状态,且执行过程中不会产生任何副作用。比如,在纯函数中不会进行任何形式的赋值操作,如修改全局变量、修改参数等。它们是可预测的,因为对于...

    JavaScript函数式编程.pdf

    不过,由于【标题】中提供了文档的名称——"JavaScript函数式编程.pdf",我可以根据这个名称扩展出关于JavaScript函数式编程的知识点。 JavaScript函数式编程的知识点非常丰富,涉及很多方面的内容,下面将详细介绍...

    从setTimeout看js函数执行过程

    JavaScript中的函数执行过程是一个复杂而微妙的主题,尤其是当涉及到异步操作如`setTimeout`时。在深入探讨之前,我们先来回顾一下标题和描述中提到的内容。本文将围绕`setTimeout`函数来理解JavaScript的执行机制,...

    JavaScript的执行过程详细研究

    ### JavaScript的执行过程详细研究 #### 一、JavaScript执行顺序概览 JavaScript作为一种广泛应用于Web开发的编程语言,其执行过程对于理解程序的行为至关重要。在深入探讨JavaScript的执行过程前,我们先来看一下...

    回调函数被连续执行两次或多次的原因

    4. **使用事件的`RemoveEventHandler`方法**:在不需要时,及时取消事件的预订,防止不必要的回调函数执行。 5. **单元测试**:编写单元测试来验证事件预订的正确性,确保事件只被预订一次,并且能够正确地触发相应...

    深入理解JavaScript执行上下文、函数堆栈、提升的概念.pdf

    2. 函数执行上下文:每当函数被调用时,都会创建一个新的执行上下文,用于函数的局部变量、参数以及函数声明。 3. Eval 执行上下文:使用 `eval()` 函数时创建的执行上下文,这个用法不推荐,因为它会有安全风险和...

    javascript函数式编程 underscore.js

    JavaScript函数式编程是一种编程范式,它强调使用函数来组织代码,将计算视为一系列惰性求值的操作。Underscore.js是一个轻量级的JavaScript实用库,它为开发者提供了大量函数式编程工具,使得在JavaScript中实践...

    QT和网页中的JavaScript函数进行相互调用的实现

    - 这里的回调函数用于处理JavaScript函数的异步返回结果,如果需要同步获取结果,可以使用`QWebEngineScript`来注册一个全局JavaScript对象,然后通过该对象调用JavaScript函数。 2. **JavaScript调用QT函数**: ...

    JavaScript 函数的执行过程

    JavaScript函数的执行过程是JavaScript语言中的核心概念,它涉及到作用域、作用域链、执行上下文和变量对象等多个重要组成部分。下面将详细解释这个过程。 首先,每一个JavaScript函数本质上都是Function对象的一个...

    javascript函数中执行C#代码中的函数

    当用户在前端页面触发某个事件(例如点击按钮),通过JavaScript函数可以调用服务器端的方法,这个过程涉及到了`__doPostBack`函数的使用。`__doPostBack`是ASP.NET框架提供的一种机制,用于在客户端触发服务器端...

    JS 函数式编程指南

    JavaScript(简称JS)函数式编程是一种编程范式,它强调将计算视为函数的组合,而不是状态的变化或指令的序列。这种编程风格可以帮助开发者编写出更简洁、可读性更强、易于测试和维护的代码。本指南将深入探讨JS函数...

    JavaScript函数式编程pdf

    JavaScript函数式编程是一种编程范式,它将计算视为数据处理,并强调使用无副作用的纯函数。在JavaScript中,函数式编程允许我们写出更简洁、可读性更强的代码,同时提高了代码的复用性和测试性。《JavaScript函数式...

    JS构造函数的执行过程

    什么是构造函数 通过new操作符调用的函数为构造...普通函数的执行过程 形成私有作用域(栈内存) 形参赋值 变量提升 代码执行 栈内存释放(或不释放) 构造函数的执行过程 1. 形成私有作用域 2. 形参赋值 3. 变量提升

    几个常用javascript函数

    本篇文章将深入探讨几个常用的JavaScript函数,这些函数在实际开发中非常常见且实用。 1. `console.log()` 这是开发者调试代码时最常用的函数之一。它用于在浏览器的控制台输出信息,帮助开发者查看程序执行过程中...

    AJAX 载入JS文件,载入CSS文件,载入JS函数,执行JS

    - **执行内联JS代码**:通过`eval`函数执行从响应数据中提取的内联JS代码。 - **执行指定函数**:同样使用`eval`函数来调用指定的函数名并执行。 #### 五、总结 本文详细介绍了如何使用AJAX在ASP应用中实现动态...

    npapi插件中插件主动调网页js函数

    标题中的“npapi插件中插件主动调网页js函数”指的是NPAPI(Netscape Plugin Application Programming Interface)插件如何在运行时调用网页中的JavaScript函数。NPAPI是一种允许浏览器加载外部代码来扩展功能的插件...

    js函数库——打包上传

    JavaScript函数库是Web开发中不可或缺的一部分,它们提供了一系列预定义的函数和工具,帮助开发者更高效、便捷地处理常见的编程任务。"js函数库——打包上传"这个主题涉及到的主要是如何整理、打包和上传JavaScript...

    JavaScript 函数式编程 (英文版)

    JavaScript函数式编程是一种编程范式,它强调将计算视为对数据进行操作的纯函数,而不是通过改变状态或显式指令来控制程序流程。在JavaScript中,函数式编程可以帮助我们写出更简洁、可读性强且易于测试的代码。下面...

    delphi与JavaScript进行交互,获取JS端返回值

    4. **处理返回值**:当JavaScript函数执行完毕后,你需要注册一个回调来接收返回值。这通常涉及事件处理或异步回调函数。 5. **安全性和错误处理**:在调用JavaScript代码时,确保考虑到可能出现的错误,比如语法...

Global site tag (gtag.js) - Google Analytics