- 每个执行环境(execution context )都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。
- 某个执行环境中的所有代码执行完毕之后,该环境被销毁,保存在其中的变量和函数也随之销毁
- 每个函数都有自己的执行环境当执行流进入一个函数时,函数的执行环境就会被推入一个环境栈中,而在函数执行完毕之后栈将其执行环境弹出,把控制权交给之前的执行环境。
- 当代码在一个环境中执行,会创建变量对象的一个作用域链(scope chain).如果执行环境是函数,则将其活动对象(activation object)作为变量对象。活动对象最开始只包含一个变量,即arguments对象。作用域链的下一个变量对象来自包含环境,而再下一个变量对象来自下一个包含环境,一直延续到全局执行环境。
- 标识符解析是沿着作用域链一级一级搜索标志符的过程,从作用域链的前端开始,然后向后回朔,直到找到标识符为止。
- 没有块级作用域。使用var声明的变量会自动添加到最接近的环境中,在函数内部,最接近的环境就是函数的局部环境。如果没有使用var 声明,该变量会自动添加到全局环境中。
- 函数声明有一个重要特性--函数声明提升(function declaration hoisting),即在执行代码之前先读取函数声明。
person() function person() { alert("person"); } teacher() var teacher = function() { //匿名函数(anonymous function) alert("teacher"); }
- 闭包是指有权访问另一个函数作用域中的变量的啊函数。创建闭包的常见方式就是在一个函数内部创建另一个函数。
-
function animal(age){ var age = age; return age; }
第一次调用animal()时创建一个包含this、arguments、age的活动对象。全局环境的变量对象包括this、animal。在创建animal()函数的时候会创建一个预先包含全局变量对象的作用域链,这个作用域链被保存在内部的[[Scope]]属性中。当调用animal()函数时,会创建一个执行环境,然后通过复制函数的[[Scope]]属性中对象构建起执行环境的作用域链。此后,又有一个活动对象被创建并推入执行环境作用域链的前端。 -
function animal(age) { return function() { document.write("dog age is: " + age); } } var dog = animal(12); dog();
当匿名函数从animal()返回后,他的作用域链被初始化为包含animal()活动对象和全局变量对象。这样匿名函数就可以访问在animal()所定义的变量。更为重要的是,animal()执行完毕之后其活动对象也不会销毁,因为匿名函数的作用域链仍然引用这个活动能够对象。换句话说,animal()执行完成之后其作用域链会被销毁,但是活动对象仍然保存在内存中;知道匿名函数被销毁,animal()活动对象才会被销毁,eg.dog = null; //解除对匿名函数的引用,则animal()函数的活动对象从内存中释放
-
function animal() { var result = new Array(); for(var i = 0;i<5;i++){ result[i]=function(num){ return function(){ document.write("这是第几个呢?: " + num) ; document.write("<br>"); } }(i) } return result; } var result = animal(); for(var i=0;i<result.length;i++){ result[i](); }
-
this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向window.
var name = "window object"; var obj = { name : "obj object", getName : function() { return function() { document.write("getName: " + this.name); } } } obj.getName()();
-
模仿块级作用域
function animal() { (function() { alert(); var i = 12; })() alert(i); //i是没有定义的,报错 } animal();
-
任何函数中定义的变量都是私有变量,包括函数的参数、局部变量和在函数内部定义的其他函数。
function Animal() { var age =22; function addAge(){ console.log("addAge this : ",this); //这个this为window age++; } this.publicMethod = function(){ console.log("publicMethod this : ",this); //这个this为Animal addAge(); alert(age); return this; } } var animal = new Animal(); animal.publicMethod().publicMethod();
-
静态私有变量
(function() { document.write("匿名函数被调用"); var name = "" Person = function(value) { name = value; } Pserson.prototype.getName = function() { document.write("name: " + name); } })(); var p1 = new Person("zhang"); p1.getName(); var p2 = new Person("zhao"); p1.getName();
相关推荐
JavaScript 变量作用域详解 JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 ...
### JavaScript 变量作用域详解 #### 一、引言 在探讨JavaScript的面向对象特性之前,理解变量作用域的概念至关重要。本篇文章旨在通过一系列示例和解释,帮助读者掌握JavaScript中的变量作用域机制。 #### 二、...
深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...
4. **块作用域**:某些语言(如JavaScript)支持在特定代码块(如if语句或for循环)内定义对象。这些对象仅在该代码块内可见,块结束后就会消失。 5. **静态作用域**:静态作用域(也称为词法作用域)是指对象的...
JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...
JavaScript 执行环境和作用域的深层次理解 在 JavaScript 中,执行环境和作用域是两个非常重要和基本的概念,理解了这两个概念对于 JavaScript 中很多脚本的运行结果就能明白其中的道理了。执行环境是一个概念,一...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript。 任何程序设计...
// 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域,在全局作用域中定义的作用域 全局作用域。 在任何位置都可以访问 // 局部变量:在函数作用域之间里的一个或者...
JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性和生命周期。了解JavaScript作用域对于编写高效、安全的代码至关重要。本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数...
### JS的作用域与闭包 #### 一、作用域的基础概念 作用域是JavaScript中一个非常核心的概念,它定义了变量的可见性和生命周期。在学习作用域之前,我们需要先了解几个基本概念: - **变量**: 在JavaScript中,...
JavaScript作用域是编程中至关重要的概念,它定义了变量、函数和对象的可见性和生命周期。在JavaScript中,作用域主要分为两种类型:全局作用域和局部作用域。此外,随着ES6的引入,块级作用域和函数作用域也变得...
在深入理解JavaScript编程时,作用域分配与变量访问规则是核心概念之一,而闭包则是JavaScript中一个非常重要的特性。本篇文章将详细介绍函数对象、作用域链以及执行上下文之间的关系,并通过代码实例和作用域链的...
本文将从JavaScript权威指南出发,深入探讨变量作用域的相关知识点,包括全局作用域、局部作用域、以及闭包等高级概念。 #### 二、全局作用域与局部作用域 1. **全局作用域** - 定义:在JavaScript中,如果一个...
JavaScript中的作用域链是编程中一个至关重要的概念,它决定了变量和函数的可访问性以及在不同作用域内的查找顺序。在深入理解作用域链之前,我们首先要了解什么是执行环境和变量对象。 执行环境,简单来说,就是...
2. **作用域和闭包**:了解JavaScript的作用域规则,如何创建和使用闭包,可以帮助开发者更好地管理内存,避免全局变量污染,提高代码复用性。 3. **对象和原型链**:深入理解原型和原型链,包括对象的创建方式、...
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
《你不懂JS:作用域与闭包》这本书深入讲解了JavaScript中两个核心概念:作用域和闭包。作用域是JavaScript变量和函数定义的可见范围,它决定了代码中哪些部分可以访问特定变量。理解作用域对于编写可维护和高效的...
JavaScript作用域是指在JavaScript代码中,变量、常量、对象和函数能够访问的范围。在编程中,变量和函数的使用都受到作用域的限制,决定了它们能够在哪些代码块中被引用。作用域有助于防止变量命名冲突,也使得程序...
讨论javascript作用域,很多人被javascript作用域搞迷糊了,这个应该有用。