- 每个执行环境(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();
相关推荐
你不懂JS You Don’t Know JSYou Don’t Know JS You Don’t Know JS
js变量作用域
javascript变量作用域 希望对大家有帮助
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript。 任何程序设计...
// 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域,在全局作用域中定义的作用域 全局作用域。 在任何位置都可以访问 // 局部变量:在函数作用域之间里的一个或者...
深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx
作用域分配与变量访问规则 在 ECMAScript 中,函数也是对象。函数对象在变量实例化过程中会根据函数声明来创建,或者是在计算函数表达式或调用 Function 构造函数时创建。(关于’函数对象’请见《理解Javascript_08_...
理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com
对javascript执行环境,作用域的深层次理解,
讨论javascript作用域,很多人被javascript作用域搞迷糊了,这个应该有用。
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...
javascript中没有块级作用域,取而代之的javascript使用的是函数作用域,下面使用示例学习一下js作用域的使用方法
全局(global)变量的作用域是全局性的,在javascript中,它的存在都有定义。而在函数之内声明的变量,就只在函数体内部有定义。它们是局部(local)变量,作用域是全局性的。函数的参数也是局部变量,它们只在函数体...
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。 ...
JavaScript应用实例-js块级作用域.js
本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础 ...
作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的...大多数类C语言都拥有块级作用域,JS却没有。请看下文demo: //C语言 #include void main() { int i=2; i--; if(i) { int j=3; } printf("%d/
前端面试题,包含JavaScript的闭包,作用域,原型,原型链,上下文环境以及DOM,BOM封装函数深度克隆,以及一些常见的·JS问题,试题简单但是容易混淆,作为前端工程师必考题