一. 变量声明

变量用var关键字来声明,如下所示:

var num;
var a,b;
var name = "ting";
var i=0, j=1, k=2;

用var关键字申明的变量是永久的,用delete运算符删除不起作用。

var i = 2;
delete i;
console.log(i);  // k = 3;
delete k;
console.log(k); //报错:ReferenceError: k is not defined.

JavaScript变量是松散类型的,可以用来保存任何数据类型。并且还可在修改变量的值时改变变量的类型。

var answer = 10;
answer = "The answer is: " + 10;
console.log(answer);                //
console.log(typeof answer);         //string

二. 变量作用域

变量的作用域是程序中定义这个变量的区域。函数内部声明的变量只在函数内部起作用。声明局部变量一定要使用var关键字声明。

在函数内部,局部变量作用域高于同名全局变量。

var i = 99;
function foo() {
    var i = 100;
    console.log(i);  //100(使用局部变量)
}
foo();
console.log(i);      //99(使用全局变量)

声明局部变量未使用var关键字,该变量会暴露在全局环境中,与现有的全局变量冲突。如下代码中,函数内部的变量a未使用var关键字,与全局环境中的a冲突,在全局环境中调用a。

var a = 5;
function foo() {
    a = 10;
    b = 15;
    console.log(a);  //
    console.log(b);  //
}
foo();
console.log(a);      //
console.log(b);      //

变量在未声明的情况下被初始化,会被添加到全局环境。

var add = function(a,b) {
    var sum = a + b;
    return sum;
}
var res = add(2,3);
console.log(res);       //
console.log(sum);       //ReferenceError: sum is not defined var add = function(a,b) {
    sum = a + b;
    return sum;
}
var res = add(2,3);
console.log(sum);       //

JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境。每个函数在被调用时都会创建自己的执行环境,当函数执行完,当前执行环境被销毁。

每个执行环境都有一个与之关联的作用域链。在执行代码时,JavaScript引擎会通过搜索执行环境的作用域链来解析变量和函数名这样的标识符。 解析过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符,一旦找到标识符,搜索过程就停止,否则继续沿作用域链向上搜索,一直搜索到全局对象。如果没有搜到,则认为该标识符未定义。标识符在作用域链中的位置越深,查找和访问它的时间越长,所以尽可能使用局部变量。

全局环境只能访问在全局环境中定义的变量和函数,不能直接访问局部环境中的任何数据。

三.  没有块级作用域

JavaScript中没有块级作用域,举个例子。如果JavaScript中有块级作用域的话,控制台输出的应该是undefined。但实际上控制台输出的是100,这是为什么呢? 原因在于:没有块级作用域,变量i没有被销毁,因此还能访问到这个变量。

for(var i=0; i<100; i++) {
    //todo
}
console.log(i);   //

JavaScript中存在函数作用域。当foo函数执行完毕后,函数内的变量将被销毁,因此控制台报错。

function foo() {
    var bar = "fn";
}
foo();
console.log(bar);  //报错:ReferenceError: bar is not defined.

函数作用域模拟块级作用域。

(function() {
    for(var i=0; i<100; i++) {
        //todo
    }
})();
console.log(i);   //报错:ReferenceError: bar is not defined.

再看一例:局部变量a在整个foo函数内部都有定义的,隐藏了全局变量a。但第一个console在变量初始化之前,所以其值为undefined。

var a = 8;
var foo = function() {
    console.log(a);     //undefined
    var a = 5;
    console.log(a);     //
};
foo();

四. 未赋值的变量和未定义的变量

未赋值的变量值为undefined,而使用未定义的变量会引起错误。

var a;
console.log(a);  //undefined
console.log(b);  //ReferenceError: b is not defined

五. 垃圾收集(garbage collection)

JavaScript具有自动垃圾收集机制,Javascript解释器可以检测到何时程序不再使用一个对象,就把它所占用的内存释放。

时间:2014-10-22

地点:合肥

引用:http://wlog.cn/javascript/javascript-variable-scope-chain.html

http://segmentfault.com/blog/liangyi/1190000000692129

JavaScript 变量作用域的更多相关文章

  1. 【转】javascript变量作用域、匿名函数及闭包

    下面这段话为摘抄,看到网上大多数人使用的是变量在使用的时候声明而不是在顶端声明,也可能考虑到js查找变量影响性能的问题,哪里用就在哪里声明,也很好. 在Javascript中,我们在写函数的时候往往需 ...

  2. 第一百零六节,JavaScript变量作用域及内存

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

  3. JavaScript变量作用域

    全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返 ...

  4. 深入理解Javascript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  5. JavaScript 变量作用域 详解

    变量作用域要点 - 在JavaScript中没有块级作用域,只有函数作用域 - 在函数体内,局部变量的优先级高于同名的全局变量 - 在全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用v ...

  6. JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

    在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量 ...

  7. 基础系列(1)之干掉JavaScript变量作用域

     今天去某顺公司面试,发现一些基础知识都不记得了,于是乎决定把js基础系列的全部梳理一遍,今天就整理下js变量作用域的相关基础知识点,配合最常遇到的笔试题阐述. 题一: var g = "a ...

  8. 深入浅出JavaScript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  9. JavaScript 变量作用域和声明提升

    一.变量作用域 说到这个概念,不有自主的想到this,scope 这两个关键字. JavaScript的this总是指向一个明确的对象,这个对象是在执行的时候动态绑定的.通俗的说就是谁调用我,我的th ...

随机推荐

  1. SpringMVC和MyBatis整合

    目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTfu ...

  2. Cocos2d-x 核心概念 - 游戏循环与调度

    每一个游戏程序都有一个循环在不断运行,他是由导演对象来管理和维护. 如果需要场景中的精灵运动起来,我们可以在循环中使用定时器(Scheduler)对精灵等对象的运行进行调度 因为Node中封装了 Sc ...

  3. Chrome谷歌浏览器下不支持css字体小于12px的解决办法

    先来看下 ie.火狐.谷歌浏览器下各个字体显示情况 ie下: 火狐下: 谷歌下: 从上面的图可以很明显看出谷歌下 css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px; 那么网上一 ...

  4. github desktop 在线安装失败解决方案

    1.问题概述 我的OS是Windows8.1 64位,尝试安装github desktop,始终安装失败:进度到50%左右就炸了.提示说:网络出错.(我100M电信,网络出错?我一直都在上网好吗). ...

  5. MFC编程入门之二十三(常用控件:按钮控件的编程实例)

    上一节讲了按钮控件Button.Radio Button和Check Box的基本用法,本节继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用. 因为Button控件在前 ...

  6. freeMarker生成静态页面

    项目结构图 footer.ftl des==>${f.des}<br/> <a href="http://www.baidu.com"> 百度 < ...

  7. Docker容器是否可以改变世界?

    Docker容器是否可以改变世界? 2016-01-15 杜亦舒 2016年了,很多大牛开始预测技术趋势,其中一个普遍的观点我也很认同: Docker会更加流行,会改变程序世界 2015年的上半年我接 ...

  8. 强大的打印功能jatoolsPrinter使用总结

    最近功能做项目,需要实现打印条码标签的功能,对于第一次接触打印机的小白来说简直是折磨死我拉,公司采购的打印机是斑马的GK888T,其实,如果单纯的想实现能打印出来标签的话,直接用window.prin ...

  9. CSS3图片倒影技术实现及原理

    CSS3图片倒影技术实现及原理 目前为止我们已经探讨了很多CSS3中的新功能和新特征.除了上面这些,实际上还有很多CSS新属性并未包含进CSS3官方标准中,像谷歌浏览器或火狐浏览器等都会利用CSS的浏 ...

  10. 今天初步了解了informix的锁的概念

     今天初步了解了informix的锁的概念  2005-06-12 01:07:05 分类: IT生活 在load的时候,碰到好几次"-134 ISAM Error :no more loc ...