javascript之变量、作用域、作用域链
一、变量
javascript的变量是松散类型的,所谓松散类型就是说定义的变量可以用来保存任何类型的数据。定义变量时要使用var操作符后面跟变量名。这里的var是一个关键字,如果定义变量时省略了var,那么这个变量就成了全局变量。但一般不推荐这么做,因为在局部作用域中定义全局变量会很难维护,并且会因为相应的变量不会马上就有定义而导致不必要的混乱。
定义变量时的格式:var a="hi"; var b=false; var c=23; 还可以这么定义:var a="hi",b=false,c=23;
二、作用域
作用域(scope):简单的说:就是创建一个函数是在什么环境下创建的,它控制了javascript代码运行时变量和函数可访问的范围。在javascript中,变量的作用域可分为全局作用域和局部作用域。
1、全局作用域(globle scope):在代码中任何地方都能访问到的对象拥有全局作用域。ps:全局变量尽量少用,因为它效率低,污染全局环境,一般有以下三种方式获取全局作用域。
(1)在代码最外层定义的函数和变量拥有全局作用域。
var a=2;
function b(){
var a=4;
}
b();
alert(a);//
(2)在函数内部没有用var定义的拥有全局作用域。(此时函数内部定义的a已经污染了全局变量定义的a了,所以在定义变量的时候尽量养成写var的习惯)
var a=2;
function b(){
a=3;
b=4;
}
b();
alert(a);//
alert(b);//
(3)所有window对象的属性拥有全局作用域。(浏览器的全局对象是window,所以全局的函数和变量都是window的属性,并且拥有全局作用域)
function a(){
window.b=1;
}
a();
alert(b);//
2、局部作用域(local scope):和全局作用域相反,局部作用域一般只在固定的代码段内可访问,最常见的是在函数内部,所以在一些地方也会把它称为函数作用域,如,下面的变量b就是一个局部变量,在函数的外部是访问不到它的。
var a=function(){
var b=1;
}
a();
alert(b);//undefined
三、作用域链
javascript作用域是通过作用域链来实现的。javascript函数对象中拥有一个仅供javascript引擎访问的内部属性-[[scope]],[[scope]]指向一个集合,即作用域链,它决定了哪些数据能被函数访问。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问,
var a=1;
var fn1(){
var a=9;
function fn2(){
alert(this.a);//1,这里的this指代的是window
alert(a);//
}
fn2();
}
fn1();
上面代码的作用域链由下图表示,不要嫌丑,用PS一笔一划勾出来的啊啊!因为不会用PPT·····
四、作用域链与javascript代码优化
代码在运行时,变量的查找总是在作用域链的底层开始往上查找,如果第一层没有查到,就要从更高一层作用域查找,这样一直找下去,直到全局作用域,如果没有找到就返回undefined。
从作用域链的结构可以看出,在运行期上下文的作用域中,标识符所在的位置越深,读写速度就会越慢。因为全局变量总是存在于运行期上下文作用域链的最末端,因此在标识符解析的时候,查找全局变量总是最慢的。所以在编写代码的时候,尽量少使用全局变量,尽可能的使用局部变量。
一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用,如以下代码:
function changeColor(){
document.getElementById("a").onclick=function(){
document.getElementById("b").style.left="0px";
}
}
这个函数引用了两次全局变量document,查找该变量必须遍历整个作用域链,直到最后在全局对象中才能找到,这段代码可以重写如下:
function changeColor(){
var doc=document;
doc.getElementById("a").onclick=function(){
doc.getElementById("b").style.left="0px";
}
}
PS:这段代码比较简单,重写后不会显示出巨大的性能提升,但是如果程序中有着大量的全局变量被反复访问,那么重写后的性能代码会显著改善。
五、作用域链的延长
当执行流进入下列任何一个语句时,作用域链都将延长。
1、try—catch语句的catch快; 2、with语句;
此两个语句会在作用域的前端添加一个变量对象,对with语句来说,其变量对象中包含着指定对象的所有属性和方法所作的变量申明;对catch来说,其变量对象中包含的是被抛出的错误对象的申明,这些标量对象都是只读的。因此在with和catch中申明的变量都会被添加到所在执行坏境的变量对象中。当with和catch语句结束后,作用域链会恢复到以前的状态。值得一提的是:改变了javascript的作用域链后,代码效率会降低,访问代价会变高。
javascript之变量、作用域、作用域链的更多相关文章
- 从头开始学JavaScript (二)——变量及其作用域
原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...
- JavaScript笔记:变量及其作用域
一.变量的定义及声明 在javascript中变量仅仅是用来保存值的一个占位符而已,定义变量时要使用关键字var后跟一个变量名,如下所示: var message; //定义一个变量message,像 ...
- JavaScript 中变量、作用域和内存问题的学习
这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...
- 【点滴javascript】变量与作用域
基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引用类型:多个值构成的对象 在变量赋值结束后,解析器必须知道这个变量时基本数据类型还是引用类型,需要注意的 ...
- javaScript之 变量、作用域和内存问题
<javaScript高级程序设计>第四章 读书笔记 4.1 基本类型 和 引用类型 的值 1. 基本类型值 包括:Undefined.Null.Boolean.Number 和 St ...
- javascript的变量、作用域和内存问题
基本类型和引用类型的值执行环境垃圾收集 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段引用类型值指那些可能由多个值构成的对象 基本数据类型 ...
- JavaScript中变量、作用域、内存问题
这几天,闲的没事看看JavaScript高级编程,感觉JavaScript真的很强大,尤其是采用面向对象的编程方式. 一. 基本类型和引用类型的值: ECMAScript变量可能包含两种不同数据类 ...
- JavaScript之变量、作用域和内存问题
js中的变量可能包含2种数据类型,基础数据类型和引用数据类型. 一般而言,基本数据类型是数据段,引用数据类型是对象. 保存方式的不同: 基本类型可以直接操作保存在变量中的值:而引用类型真实的值是保存在 ...
- JavaScript中变量、作用域和内存问题(JavaScript高级程序设计第4章)
一.变量 (1)ECMAScript变量肯能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象. (2)基本数据类型是按值访问,可 ...
随机推荐
- CRM-BP相关FUNCTION
获取BP的地址信息:BUPA_ADDRESS_GET_DETAIL 修改BP的信息:CRM_WAP_BP_CHANGE BUTO50存放2个BP之间的关系 获取BP的角色 BAPI_BUPA_ROLE ...
- 基于S7-200的PLC对里程轮(增量式码盘)解码的应用
解码模块为JC-11:工业增量式码盘 解码模块,接口简单,易于使用. 应用Step7-MicroWIN编程软件,为S7-200PLC设计本编码盘的应用程序.由于编码盘输出的脉冲信号频 ...
- iOS开发——面试指导
iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...
- JQuery Mobile navbar动态刷新创建
今天突然用到须要动态改变tab页, 布局代码例如以下: <div data-role="navbar" id='divtab'> <ul id='divtabul ...
- 安装opencms时遇到问题及解决方法
1. MySQL system variable 'max_allowed_packet' http://blog.csdn.net/hqa_ii/article/details/6872367 安装 ...
- JAVA_java关联源码
java怎样关联源码?? 1,按住control键,点一下你要看源码的类,跳到如下界面: 2,单击,跳到下一个界面 3,继续,找到jdk按照路径,找到src.zip文件 4. 4. 点击OK就可以看源 ...
- highcharts 去掉右下角链接
去掉右下角的highcharts.com链接需要加入以下代码: credits: { enabled:false }, 如果不设置,那么默认为显示.
- 【转】web测试方法总结
一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直接输入特殊字符时 ...
- MongoDB基本操作
转:http://zhidao.baidu.com/link?url=D5s4tNnP6hH0XPZkFooV-o4MQH3pNZh7C3rtLX_HtVWaIyBRhLIUyoZYfVv15l2eS ...
- 301页面转向 php
新建301.php页面,在程序入口文件index.php引用301.php页面 301.php内容如下,仅用于参考: <?php$the_host = $_SERVER['HTTP_HOST'] ...