JavaScript变量作用域

标签: javascript 变量 作用域 | 发表时间:2011-07-04 13:04 | 作者:狼の禅 ~Wing~
出处:http://www.cnblogs.com/

变量作用域是程序中定义这个变量的区域。

先贴一段代码,如果读者对代码的输出并不感到困惑就不用往下面读了。

 

/*  代码1  */
var scope = "global ";
function checkScope() {
    var scope = "local ";
    function childCheck() {
        var scope = "childLocal ";
        document.write(scope);
    }
    function childUndefined() {
        document.write(scope);
        var scope;
    }
    function childOverride() {
        scope = "childOverride ";
        document.write(scope);
    }
    document.write(scope);  //输出"local"
    childCheck();           //输出"childLocal"
    childUndefined();       //输出"undefined"
    childOverride();        //输出"childOverride"
    document.write(scope);  //输出"childOverride"
}
checkScope();               //输出"local childLocal undefinedchildOverride childOverride"
document.write(scope);      //输出"global "

  1. 全局作用域与局部作用域
    全局(global)变量的作用域是全局的,在Javascript中处处有定义;而函数内部声明的变量是局部(local)变量,其作用域是局部性的,只在函数体内部有定义。对于下面的输出读者应不会感到意外。
    /*  代码2  */
    var scope = "global";
    function checkScope() {
        var scope = "local";
        document.write(scope);
    }
    checkScope();           //输出"local"
    document.write(scope);  //输出"global"
    

    全局变量作用域中使用变量可以不用var语句,但在声明局部变量是一定要使用var语句,否则会视为对全局变量的引用。看下面代码:

    /*  代码3  */
    var scope = "global";
    function checkScope() {
        scope = "local";
        document.write(scope);
    }
    checkScope();           //输出"local"
    document.write(scope);  //输出"local"
    

  2. 没有块作用域

    Javascript没有块级作用域,函数中声明的变量在整个函数中都是有定义的。对于下面的代码对于生疏的读者可能颇感意外:

    /*  代码4  */
    var scope = "global";
    function checkScope() {
        document.write(scope);  //语句4.1
        var scope = "local";    //语句4.2
        document.write(scope);
    }
    checkScope();           //输出"undefinedlocal"
    

    由于语句4.1(var scope = "local";)声明的变量在整个checkScope函数作用域内都有效,因此在语句4.2(document.write(scope); )执行的时scope引用的是局部变量,而此时局部变量scope尚未定义,所以输出”undefined”。因此一个好的编程习惯是将所有的变量声明集中起来放在函数的开头。

    在了解了上述内容之后,读者再看看代码1应该不会感到困惑了。
  3. 对象的属性变量
    对象的属性变量比较容易理解,看一下下面的代码读者应该不会感到疑惑。
    /*  代码5  */
    var scope = "global ";
    var obj = new Object();
    obj.scope = "object ";
    obj.checkScope = function () {
        var scope = "loacl ";
        document.write(scope);          //输出"loacl"
        document.write(this.scope);     //输出"object"
        document.write(window.scope);   //输出"global"
    }
    obj.checkScope();   //输出"loacl object global"
    

    原文链接:http://blog.csdn.net/kingwolfofsky/article/details/6581944

作者: 狼の禅 发表于 2011-07-04 13:04 原文链接

评论: 7 查看评论 发表评论


最新新闻:
· 出发,为了无处不在的 webOS(2011-07-04 21:05)
· iPad的使用量激增 占全球网络浏览量1%(2011-07-04 21:03)
· 我的10个开发原则(2011-07-04 21:01)
· 七大被低估科技股:苹果微软榜上有名(2011-07-04 20:54)
· Google不允许13岁以下儿童使用Gmail(2011-07-04 20:44)

编辑推荐:博客园电子期刊2011年6月刊发布

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [javascript 变量 作用域] 推荐:

JavaScript变量作用域

- ~Wing~ - 博客园-首页原创精华区
变量作用域是程序中定义这个变量的区域. 先贴一段代码,如果读者对代码的输出并不感到困惑就不用往下面读了. /* 代码1 */ var scope = "global "; function checkScope() {. document.write(scope); //输出"local". //输出"childLocal".

[译]Javascript 作用域和变量提升

- - justjavac(迷渡)
下面的程序是什么结 果. 这可能是陌生的,危险的,迷惑的,同样事实上也是非常有用和印象深刻的javascript语言特性. 对于这种表现行为,我不知道有没有一个标准的称呼,但是我喜欢这个术语:“Hoisting (变量提升)”. 这篇文章将对这种机制做一个抛砖引玉式的讲解,但是,首先让我们对javascript的作用域有一些必要的理解.

JavaScript变量作用域探究

- - JavaScript - Web前端 - ITeye博客
JavaScript变量作用域探究. 前段时间,在coding的时候,碰到了当时感觉不可思议的问题. 当时对这个问题很困惑,回去恶补了下JS变量的相关知识,发现还是自己的基础知识掌握的不够扎实,于是决定探究下JS变量的相关机制. 如果你对上面的结果也有疑问,我相信看完下面的讲解之后,再看这问题,天空飘来五个字:“那都不叫事”.

javascript的词法作用域

- 恋上女人香 - 断桥残雪部落格
大家应该写过下面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里,那方法执行时,它能访问哪些变量,不能访问哪些变量,这个怎么判断呢. 这个就是我们这次需要分析的问题——词法作用域. 词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域.

JavaScript 函数、作用域和继承

- - 幸福收藏夹
关于函数、作用域和继承,可以写的非常多. 不过和 JavaScript 类型浅解 一样,是写给初学者看的,我们着重从简单的来. 当然,即使用「简单」来描述,这也是 JavaScript 中最不容易懂的点之一. 如你所见, function fn(){},像这个声明式函数. 虽然初学看起来有点乱,不过我想说的是,你总会知道如何用的,现在知道就可以了.

Javascript诞生记

- Milido - 阮一峰的网络日志
二周前,我谈了一点Javascript的历史. 今天把这部分补全,从历史的角度,说明Javascript到底是如何设计出来的. 只有了解这段历史,才能明白Javascript为什么是现在的样子. 我依据的资料,主要是Brendan Eich的自述. "1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.

JavaScript,你懂的

- dylan - keakon的涂鸦馆
经常有人问我,JavaScript应该怎么学. 先学基本语法,如果曾学过C等语言,应该1小时内就能掌握了. 再去使用内置的函数、方法和DOM API,熟悉它能干什么;而在学习DOM API的过程中,你还不得不与HTML和CSS打交道. 然后弄懂匿名函数和闭包,学会至少一个常用的JavaScript库(例如jQuery).

Javascript 里跑Linux

- rockmaple - Shellex's Blog
牛逼到暴的大拿 Fabrice Bellard,用Javascript实现了一个x86 PC 模拟器,然后成功在这个模拟器里面跑Linux(请用Firefox 4 / Google Chrome 11打开,Chome 12有BUG). 关于这个东西… 伊说 “I did it for fun“,大大啊大大啊….

高效 JavaScript

- xtps - ITeye论坛最新讨论
传统上,网页中不会有大量的脚本,至少脚本很少会影响网页的性能. 但随着网页越来越像 Web 应用程序,脚本的效率对网页性能影响越来越大. 而且使用 Web 技术开发的应用程序现在越来越多,因此提高脚本的性能变得很重要. 对于桌面应用程序,通常使用编译器将源代码转换为二进制程序. 编译器可以花费大量时间优化最终二进制程序的效率.

你得学JavaScript

- 蒋冰 - 伯乐在线 -博客
  注:本文由 敏捷翻译 - 蒋少雄 翻译自 Kenny Meyers 的博文.   如果三年前你问我应该学什么语言,我会告诉你是Ruby.   如果你现在想学一门语言的话,你应该学习JavaScript..   我认为,每一位Web开发人员都应该学习JavaScript. 目前推出的许多新技术都支持这个观点.