JavaScript中的作用域和作用域链(边学边写)[看着别人的博客纯手敲]

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域的工作原理。今天这篇文章对JavaScript作用域和作用域链简单的介绍,希望能帮助大家更好的学习JavaScript。

JavaScript作用域

  任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

1.全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

(1)最外层函数和最外层函数外面定义的变量拥有全局作用域,例如:

              var authorName="别散客人";
			function doSomething () {
				var blogName="Alidece";
				function innerSay () {
					alert(blogName);
				}
				innerSay();
			}
			alert(authorName);//别散客人
			alert(blogName);//错误
			doSomething();//Alidece
			innerSay();//出错

(2)所有未定义直接赋值的变量自动声明为拥有全局全局作用域,例如:

 

function doSomething () {
				var authorName ="Alidece";
				blogName = "Alidece";
				alert(authorName);
			}
			doSomething();
			alert(blogName);
			alert(authorName);//authorName is not defined

  (3)所有window对象的属性拥有全局作用域

一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

1.局部作用域(local Scope)

和全局作用域相反,局部作用域一般只在固定的代码片段内可以访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域。

function doSomething () {
				var blogName="Alidece";
				function innerSay () {
					alert(blogName);
				}
				innerSay();
			}

  作用域链(Scope chain)

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],有ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象和集合,这个集合被称为函数的作用域链,它决定了哪些数据能被访问。

当一个函数创建后,它的作用域链会被创建次函数的作用域中可访问的数据对象填充。例如定义下面这样一个函数:

function add (num1,num2) {
                var sum = num1+num2;
                return sum;
            }

在函数add创建时,它的作用域中会填入一个全局对象,该全局对象包含了所有对象变量,如下图所示(注意:图片例举了全部变量中的一部分):

未完待续。。。。

时间: 2024-08-14 22:37:25

JavaScript中的作用域和作用域链(边学边写)[看着别人的博客纯手敲]的相关文章

javascript中的变量、作用域和内存问题

[变量][1]定义:可变的量,相当于给一个不定的数据起了一个外号.变量是存储信息的容器.[2]特性:js中的变量是松散类型的,可以保存任何类型的数据.它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变.[3]变量声明:变量可以在声明时赋值,但不能有其他操作,如+=.-=等 var a = 2;//是正确的 var a += 2;//是错误的 var a = 2++;//是错误的,++只能用于变量,不能

关于JavaScript中没有块级作用域的理解

引用<JavaScript权威指南>(第六版)中的举例 代码段1: var scope="global"; function f(){ console.log(scope); scope="local" console.log(scope); } f(); 会输出什么? 答案:undefined  global 代码段2: var scope="global"; function f(){ var scope; console.log

深入理解javascript中执行环境(作用域)与作用域链

相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行环境分为全局执行环境和局部执行环境,其中局部执行环境我们又可以称之为函数执行环境.那么究竟什么使执行环境呢?通俗的说,执行环境即为代码执行时所处的环境.我们下来看一看如下代码,再进一步分析之. 1 2 3 4 5 6 7 8 9 10 11 <script><br>var name="zhuzhenwei"; functio

一篇文章带你了解JavaScript中的变量,作用域和内存问题

作者 | Jeskson 来源 | 达达前端小酒馆 1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为引用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaScript不允许直接操作对象的内存空间,实际上操作对象的引用而不是实际对象. var dada = new Object(); undefined dada.name = "dada"; "dada" console.

JavaScript中的继承与原型链

先看一个例子 function User(){} var u1 = new User(); console.log(u1.prototype);// undefined 使用对象实例无法访问到prototype console.log(User.prototype);//{},使用构造函数名访问prototype console.log(u1.__proto__);//{},使用对象实例访问prototype的指针 这个是 __proto__ 和prototype最基本的区别:说明构造的对象无p

JavaScript中的继承(原型链)

一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.property = true; } SupType.prototype.getSupvalue = function() { return this.property; }; function SubType() { this.subproperty = false; } //原型对象等于一个类型的实例

JavaScript中的原型和原型链

1.原型是什么?原型链是什么? 原型是一个prototype对象,用于表示类型之间的关系: 原型链指的是在JavaScript中对象之间的继承是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链. 举例: Student-->Person-->Object:学生继承人这个类,人这个类继承对象类: <span style="font-size:14px;"> var Person=functi

浅谈Javascript中的原型、原型链、继承

构造函数,原型,实例三者的关系 构造函数: 构造函数是创建对象的一种常用方式, 其他创建对象的方式还包括工厂模式, 原型模式, 对象字面量等.我们来看一个简单的构造函数: function Product (name, role){ //构造函数的命名约定第一个字母使用大写的形式! this.name = name; this.role = role; } ( 1 ) 每一个构造函数都有一个prototype属性,我们可以在Chorme控制台中打印出Product.prototype属性. (

我看过的好博客推荐(javaScript+Css)

1.JavaScript秘密花园 很不错的一篇博客,讲了许多javaScript常用到的需要注意的问题,比较透彻,推荐~~ 2.经验分享:CSS浮动(float,clear)通俗讲解 http://www.cnblogs.com/lizijie/p/4046938.html http://www.iyunlu.com/view/css-xhtml/55.html http://www.cnblogs.com/polk6/archive/2013/07/25/3142187.html有些乱,有空整