执行环境
执行环境可以理解为一个栈,而全局变量——一切Js在其中发生,可以理解为栈底或者是一个装载其他子执行环境的容器。
函数执行是会在其自己的执行环境中执行,递归调用中,每一次递归调用都会有新的执行环境。当调用完成后,函数会返回原始的执行环境。
调用函数式,函数的执行环境的创建过程:
1. 在函数的执行环境中,创造一个活动对象(没有预定义原型的对象,且不可直接引用)
2. 创建一个arguments对象,这个对象类似数组,拥有length,callee等属性。arguments以整数下标的形式保存实际传入函数的参数。length对应实际传入参数的个数。
3. 为活动对象创建arguments属性,指向创建好的arguments对象
4. 为执行环境分配作用域,每个函数内部的[[scope]]属性由对象列表(链)组成,这个[[scope]]会被指定给一个函数调用执行环境,作为其作用域,同时把活动对象被添加到执行环境[[scope]]的前端
5. “可变对象”(这时的可变对象就是活动对象)完成“对象实例化”创建可变命名参数,依照函数定义的形式参数。接收实际参数,没有获得实际参数的可变命名参数被置为undefined
6. 对于内部声明的函数,在执行环境中创建新的函数对象,然后创建函数名属性(指针)指向新创建的内部函数对象。并将在函数内部声明的所有局部变量创建为可变对象的命名属性。根据声明的局部变量创建的可变对象的属性在变量实例化过程中会被赋予 undefined 值。在执行函数体内的代码、并计算相应的赋值表达式之前不会对局部变量执行真正的实例化。事实上,拥有 arguments 属性的活动对象和拥有与函数局部变量对应的命名属性的可变对象是同一个对象。因此,可以将标识符 arguments 作为函数的局部变量来看待。
7. 为this关键字赋值
如果this指向一个对象的引用(比如对象的方法),则this就是引用该对象的属性。
- var ref = {
- boy : "CaoLixiang",
- girl : "HuJin",
- love : function() {
- return this.boy + " and " +
- this.girl + " love each other.";
- }
- };
- alert(ref.love());
执行后O(∩_∩)O~
如果赋值为null,则this指向全局变量(Js设计时的一个bug)
- var a = "HuJin";
- var test = function() {
- alert(this.a);
- }
-
test();
执行后O(∩_∩)O~
写在最后的:
下面这张图描述了1-7的步骤,必要时温习帮助自己理解
- 大小: 9.8 KB
- 大小: 9 KB
- 大小: 72.8 KB
分享到:
相关推荐
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
总之,深入理解JavaScript闭包对于编写高效、可维护的代码至关重要。掌握闭包不仅有助于解决实际问题,还能提高编程技巧和对JavaScript语言机制的理解。在日常开发中,无论是用于实现模块化、数据封装,还是处理异步...
1. **闭包(Closures)**:闭包是一种特殊的函数,它能够记住并访问其定义时的作用域,即使这个作用域在函数执行时已经不存在了。利用闭包可以实现数据封装和私有变量,是JavaScript中实现模块化的重要手段。 2. **...
- 闭包:理解闭包的原理,如何创建闭包,以及闭包在内存管理中的作用。 4. **异步编程** - 回调函数:了解回调地狱及其问题,以及如何通过模块化和Promise来解决。 - Promise:掌握Promise的基本用法,包括链式...
在学习JavaScript的过程中,理解闭包和作用域是至关重要的。闭包允许函数访问并操作其外部作用域的变量,而不会污染全局作用域。作用域决定了变量的可见性和生命周期。 最后,JavaScript的学习不应忽视错误处理。...
闭包在JavaScript中非常重要,可用于实现私有变量等功能。 - **回调函数**:函数作为参数传递给另一个函数,并在适当的时候被调用。 - **自执行匿名函数**:立即执行的匿名函数,常用于模块模式以避免污染全局命名...
7. **闭包**:闭包是JavaScript中一个重要的特性,它允许函数访问并操作外部作用域的变量,即使在外部函数执行完毕后,这些变量仍然可以被内部函数保留。 8. **ES6及更高版本的新特性**:包括箭头函数、模板字符串...
理解闭包和作用域对于编写高效且无bug的代码至关重要。 原型和原型链: JavaScript对象可以通过原型链共享属性和方法,这是其面向对象特性的一种体现。每个对象都有一个proto属性指向其构造函数的prototype,形成...
标题:闭包javascript.pdf 描述:详细描述JavaScript闭包,适合更进一步了解闭包。 标签:javascript 闭包 从给定的文件信息来看,主要围绕JavaScript中的闭包概念进行深入探讨。闭包是计算机科学中一个重要的...
JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...
深入理解闭包,还需要了解JavaScript的作用域、作用域链、执行上下文等概念。作用域决定了变量的可见性,全局作用域在整个脚本中都可访问,而函数作用域仅在函数内部可见。当函数执行时,会创建一个执行上下文,其中...
闭包是JavaScript中的一个高级概念,它允许函数访问并操作其词法作用域内的变量,即使该函数已经执行完毕。 在Web开发中,JavaScript最显著的应用就是DOM(文档对象模型)操作。通过DOM,JavaScript可以动态修改...
此外,闭包是JavaScript中的高级特性,它允许函数访问并操作其词法作用域内的变量,即使函数已经执行完毕。 事件处理是JavaScript与用户交互的基础,如点击、鼠标移动等。通过addEventListener和...
为了更好地理解闭包,我们首先需要了解JavaScript中变量的作用域。JavaScript中存在两种主要的作用域类型:全局作用域和局部作用域。 - **全局作用域**:在整个程序范围内都可以访问的变量。 - **局部作用域**:仅...
为了更好地理解闭包的概念,我们可以将其简化为以下几点: - **闭包的本质**:JavaScript中任何函数都是一个闭包,但当我们提到“闭包”时,通常指的是那些能够访问到外部作用域变量的嵌套函数。 - **闭包的特点**...
JavaScript 和 AJAX 是 web 开发中的两个重要概念,广泛应用于创建交互性强、动态更新的网页。这份"Learn_JavaScript_...对于有经验的开发者,这份资料可能提供了新的视角和技巧,有助于深化对JavaScript和AJAX的理解。
7. **闭包**:JavaScript的闭包是其独特特性之一,它允许函数访问和操作其外部作用域的变量,即使在其外部函数已经执行完毕后。理解和利用闭包可以创建强大的模块化和私有变量。 8. **面向对象编程**:虽然...
这些是理解闭包的基础。 - **作用域(Scope)**:指的是变量或者函数可以被访问的范围。 - **变量作用域**:指变量在其定义范围内可以被访问。JavaScript中有两种主要的作用域类型:全局作用域和局部作用域。 - **...