JavaScript作用域学习笔记

作用域即变量和函数的可访问范围。在js中,作用域包括全局作用域和局部作用域。

1 变量作用域

在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。

声明局部变量必须用var语句。

2 函数作用域(function scope)和声明提前(hoisting)

变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

1 var scope="global";
2 function f(){
3     console.log(scope);//输出“undefined”而不是”global“
4     var scope ="local";
5     console.log(scope);//输出local
6 }                                                                                                                                                 

javascript函数里声明的所有变量(不涉及赋值)都被”提前“至函数体的顶部,同时变量初始化留在原来的位置,这个特性被称为声明提前(hoisting)。所以上述过程等价于

1  var scope="global";
2  function f(){
3      var scope;
4      console.log(scope);//输出“undefined”而不是”global“
5      scope ="local";
6      console.log(scope);//输出local
7  }                                                                                                     

在函数体内,局部变脸scope将覆盖全局变量中定义的scope,但并未对其赋值,所以输出为undefined.

3 作用域链

当声明一个javascript全局变量时,实际上是定义了一个全局对象的一个属性。局部变量是和函数调用相关的某个对象的属性。

每一段javascript代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。这个作用域链是一个对象列表或链表,这组对象定义了这段代码”作用域中“的变量。当javascript需要查找变量X时(即变量解析),它会从链中的第一个对象开始查找,如果这个对象有一个名为x的属性,则会直接使用这个属性值,如果第一个对象中不存在,则继续查找链上的下一个对象,以此类推。如果没有,则最终抛出一个引用错误(ReferenceError)异常。

对象链的创建规则:当定义一个函数时,保存一个作用域链。调用这个函数时,创建一个新的对象保存它的局部变量,并添加这个对象到新保存的作用域链上。

        对于嵌套函数来说,每次调用外部函数时,内部函数又会重新定义一遍。

时间: 2024-10-15 01:43:20

JavaScript作用域学习笔记的相关文章

JavaScript闭包学习笔记

原文:JavaScript闭包学习笔记 闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解JavaScript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. JavaScript语言的特殊之处,就在于函数内部可以直接读取全局变量. 1 var n=999; 2 3 function f1() { 4 alert

javascript面向对象学习笔记(二)——创建对象

javascript面向对象学习笔记(二)--创建对象 工厂模式 该模值抽象了创建具体对象de过程.用函数来封装噫特定接口创建对象的细节. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var person1=createPerson("Chiaki&

JavaScript正则表达式学习笔记之一 - 理论基础

自从年前得空写了两篇文章之后就开始忙了,这一忙就是2个月??.当时信誓旦旦说的定期写篇博客的计划也就泡汤了??,不过好在最近有空,顺便总结一下这两个月遇到的几个问题.第一个问题就是项目中用到了一些正则才发现之前被自己忽略的正则是时候补一补了.恰逢今天周六??,就把自己学习JavaScript正则表达式的笔记整理成文,写了这篇关于正则表达式理论基础的文章,希望本文能对有需要的同学提供帮助.号外:本文相对基础,大神请忽略??. 一. 基本概念 正则表达式是用于匹配字符串中字符组合的模式. 一种几乎可

Javascript MVC 学习笔记(一) 模型和数据

写在前面 最近在看<MVC的Javascript富应用开发>一书,本来是抱着一口气读完的想法去看的,结果才看了一点就傻眼了:太多不懂的地方了.只好看一点查一点,一点一点往下看吧,进度虽慢但也一定要坚持看完.本学习笔记是对书上所讲解内容的理解和记录. 笔记里的代码大多会按书上摘录下来,因为<MVC的Javascript富应用开发>是结合了JQuery库,所以对于JQuery中不太懂的知识点也会附在代码后面,也算是一些额外的收获. MVC概述 要学习MVC,首先得知道MVC是什么,MV

JavaScript正则表达式-学习笔记(不定期更新)

JavaScript权威指南学习笔记,禁止转载! 8.正则表达式 在常见的字符串检索或替换中,我们需要提供一种模式表示检索或替换的规则. 正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 使用: /\d\d\d/.test("123");  //true new RegExp("Bosn").test("Hi,Bosn");  //true 正则基础: . 任何字符(除换行符以外) /-/.test('[email prote

JavaScript对象-学习笔记

JavaScript权威指南学习笔记,禁止转载! 5.对象 对象的属性是无序的,每个属性都有一个字符串key和值value, 数据属性的标签:writable.enumerable.configurable.value 访问器属性的标签:enumerable.configurable.get.set.get表示属性可读,set表示属性可写.属性前面有下划线表示只能通过对象方法get/set访问的属性,也就是访问器属性. (1)创建对象 1)字面量var obj={x:1,y:2}; 2)new:

《高性能JavaScript》学习笔记——日更中

------------------7-20更------------------ 最近在看<高性能JavaScript>一书,里面当中,有讲很多提高js性能的书,正在看的过程中,记下做法以及原因,供以后学习参考: 1.将经常使用的对象成员.数组项.和域外变量存入局部变量 原因:数据存储位置对大地代码整体性能会产生重要的影响,直接变量和局部变量的访问速度快于数组和对象成员.因为局部变量位于作用域链的第一个对象中,全局变量位于作用域链的最后一环.变量在作用域链的位置越深,访问的时间就越长. 1

阮一峰老师JavaScript课程学习笔记

1.switch采用的是严格相等运算符 2.break和continue都具有跳转作用,break语句跳出循环,continue用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环. 3.JavaScript内部所有数字都是以64位浮点数形式存储,涉及小数的运算和比较需要特别小心. (-1)^符号位 * 1.xx...xx * 2^指数位 4.NaN是JavaScript的特殊值,表示"非数字(Not a Number)",主要出现在将字符串解析成数字出错的场合.NaN不等于任何值

JavaScript继承学习笔记

JavaScript作为一个面向对象语言(JS是基于对象的),可以实现继承是必不可少的,但是由于本身并没有类的概念,所以不会像真正的面向对象编程语言通过类实现继承,但可以通过其他方法实现继承.(javascript中的继承是通过原型链来体现的http://www.cnblogs.com/amumustyle/p/5435653.html)实现继承的方法很多,下面就只是其中的几种. 一.原型链继承 1 function Person() { //被继承的函数叫做超类型(父类,基类) 2 this.