一、变量

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之变量、作用域、作用域链的更多相关文章

  1. 从头开始学JavaScript (二)——变量及其作用域

    原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...

  2. JavaScript笔记:变量及其作用域

    一.变量的定义及声明 在javascript中变量仅仅是用来保存值的一个占位符而已,定义变量时要使用关键字var后跟一个变量名,如下所示: var message; //定义一个变量message,像 ...

  3. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

  4. 【点滴javascript】变量与作用域

    基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引用类型:多个值构成的对象 在变量赋值结束后,解析器必须知道这个变量时基本数据类型还是引用类型,需要注意的 ...

  5. javaScript之 变量、作用域和内存问题

    <javaScript高级程序设计>第四章  读书笔记 4.1  基本类型 和 引用类型 的值 1. 基本类型值 包括:Undefined.Null.Boolean.Number 和 St ...

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

    基本类型和引用类型的值执行环境垃圾收集 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段引用类型值指那些可能由多个值构成的对象 基本数据类型 ...

  7. JavaScript中变量、作用域、内存问题

    这几天,闲的没事看看JavaScript高级编程,感觉JavaScript真的很强大,尤其是采用面向对象的编程方式. 一.   基本类型和引用类型的值: ECMAScript变量可能包含两种不同数据类 ...

  8. JavaScript之变量、作用域和内存问题

    js中的变量可能包含2种数据类型,基础数据类型和引用数据类型. 一般而言,基本数据类型是数据段,引用数据类型是对象. 保存方式的不同: 基本类型可以直接操作保存在变量中的值:而引用类型真实的值是保存在 ...

  9. JavaScript中变量、作用域和内存问题(JavaScript高级程序设计第4章)

    一.变量 (1)ECMAScript变量肯能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象. (2)基本数据类型是按值访问,可 ...

随机推荐

  1. zookeeper配置同步zookeeper编程

    分布式助手Zookeeper(四) kissyoudyb 2013-12-05 17:41 阅读:33 评论:0     分布式助手Zookeeper(三) kissyoudyb 2013-12-05 ...

  2. Apache中 RewriteRule 规则参数介绍

    Apache中 RewriteRule 规则参数介绍 摘要: Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量 ...

  3. OpenCMS integration with Spring MVC--reference

    ref from:http://blogs.indrajitpingale.com/?p=8 http://blog.shinetech.com/2013/04/09/integrating-spri ...

  4. Nodepad ++

    Nodepad ++是一个很好用的记事本工具.轻巧.打开文本速度要比windows内置的记事本快,而且功能众多. 支持多种语言,关键字高亮显示 并且可以折叠 内置n种主题,随时换 文件内容一变随时提醒 ...

  5. 学习jQuery后的部分总结

    1.remove和empty <div id="div1"> <ul id="ul1"> <li>嘿嘿</li> ...

  6. Swift基础语法-内存管理, 自动引用计数

    1. 工作机制 Swift和OC一样,采用自动引用计数来管理内存 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1 当该强引用消失时,引用计数会自动-1 当引用计数为0时,该对象会被销毁 2 ...

  7. Lucene 搜索功能

    搜索过程 图解: 主要 API: IndexSearcher:    //所有搜索都通过 IndexSearcher 进行,他们将调用该类中重载的 search() 方法 Query:         ...

  8. MATLAB 误差函数erf(x)

    误差函数: 1.误差函数定义为:   它的性质如下: 2 互补误差函数定义为: 它具有如下性质: 下表给出了误差函数的部分数值: 0.00 0.00000 0.05 0.05637 0.10 0.11 ...

  9. flex/bison 计算器

    flex %{ #include <stdio.h> #include "mycalc.tab.h" ;} %} %% "+" return ADD ...

  10. easyUI 比较时间大小

    //                    function toDate(str){ //                        var sd=str.split("-" ...