开始

一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量具有全局作用域,在javascript中的任何地方都是有定义的。然而在函数内申明的变量只在函数体内有定义。他们是局部变量,作用域是局部性的。函数参数也是局部变量,他只在函数体内有定义。下面就来看看我在这几个方面做的尝试与测试。

1.全局变量可以被任何地方访问到,而局部变量则不行。我们来看看下面的代码:

    var global = "global";
function f(){
var local = "local";
alert(global); //==>"global" 全局变量可以被访问的
}
f();
alert(local); //==> 报错:local is not defined

2.尽管全局变量可以不用var申明,但是局部变量就一定要用var申明。否则的话,如果申明的局部变量与一个全局变量重名的情况下就会修改这个全局变量,如果没有与之重名的全局变量就会申明一个全局变量。我们来看看下面的代码:

    function f(){
local = "local"; //没有用var申明,相当于申明了全局变量
}
f();
alert(local); //==> "local" var global = "global";
function f2(){
global = "local"; //没有用var申明并且有与之重名的global全局变量相当于修改了global全局变量
}
f2();
alert(global); //==> "local"

3.在函数体内,局部变量的优先级要高于同名的全局变量。如果在函数体内申明的一个局部变量或者函数参数中带有变量和全局变量重名,那么全局变量就会被拘捕变量覆盖。我们来看看下面的代码:

   var scope = "global";        //申明一个全局变量
function f(){
var scope = "local"; //申明一个同名的局部变量
alert(scope);
  }
f(); //==> "local"

4.函数体内全局变量的申明提前。说道申明提前,可能比较陌生。我们就来看一下一道经典的javascript面试题:

    var scope = "global";
function f(){
alert(scope);
var scope = "local";
alert(scope);
}
f();

也许你会误以为函数中的第一行会输出"global",因为代码还么有运行到var语句申明局部变量的地方。其实不然,由于函数作用域的特性,局部变量在整个函数体始终是定义的,也就是说,在函数体内的局部变量覆盖了全局变量,只有在var语句执行是才给其赋值。所以代码等同于以下代码:

    function f2(){
var scope;
alert(scope); //undefined
scope = "local"; //local
alert(scope);
}
f2();

明白了吧,所以有经验的程序员都会将函数体内的申明都会提前到前面,这是一种良好的编码习惯。

5.那么函数参数和申明的局部变量重名的情况呢?

    function f(t){
alert(t);
var t;
alert(t)
}
function f2(t){
alert(t);
var t = 30;
alert(t);
}
f(20);
f2(20);

看一下运行结果:f()-->20 , 20;  f2()-->20 , 30;

这是什么原因呢?我总结了一下:在函数参数和局部变量重名的情况下,如果局部变量只是申明了,但是没有赋值,局部变量是不会覆盖参数的。如果局部变量赋值了,就从赋值的那一行起,向下覆盖参数变量。

通过以上的发现是不是明了许多了?其实javascript入门容易,但是精通难。所以大家一起共勉进步吧。最后引用一下《javascript权威指南》为本文做一下总结:"javascript最顶层的代码中(也就是不包含在任何函数定义的代码),作用域链由一个全局对象组成。在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。当定义一个函数时,他实际上保存了一个作用域链。当调用这个函数时,他创建一个新的对象来存储他的局部变量,并将这个对象添加至保存的那个作用域上,同事创建一个新的更长的表示函数用用作用域的‘链’"

=============低调的分割线==============

关于javascript变量作用域的研究。的更多相关文章

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

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

  2. php中include文件变量作用域的研究

    原文:php中include文件变量作用域的研究 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件 ...

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

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

  4. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  5. JavaScript变量作用域

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

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

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

  7. JavaScript 变量作用域 详解

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

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

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

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

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

随机推荐

  1. UC编程:输入输出重定向(标准IO)

    [c] #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char szBuf[100]; /* 将屏 ...

  2. html5跨域数据传递(postMessage)

    在html5中有个支持跨域传递的方法postMessage,可是实现iframe之间的数据传递! 代码如下:数据发送页面 <!DOCTYPE HTML> <html lang=&qu ...

  3. 【转】Android折叠效果实现案例

    源文:http://mobile.51cto.com/abased-401983.htm 为了使界面的效果更加绚丽,体验效果更佳,往往需要开发者们自行开发新的界面效果,在这里,我将奉上各种实现折叠效果 ...

  4. CodeSmith开发系列资料总结

    CodeSmith开发系列资料总结 最近跟同事在研究CodeSmith,感觉中文文档是少之又少,所以我们自己写(翻译)了一些文档,总结如下,希望对使用CodeSmith的朋友有所帮助: “努力学习的熊 ...

  5. rsync服务器

    转自:http://www.mike.org.cn/blog/index.php?load=read&id=639###pp=0 [rsync实现网站的备份,文件的同步,不同系统的文件的同步, ...

  6. 解决ZF2_PATH environment

    本方法基于:ZendFramework 2.1.4版本在WIN7下构建,其他版本的安装方式相差不大. 操作之前您需要搭建好PHP运行环境,保证PHP版本不低于PHP 5.3.3,并且去http://f ...

  7. Visual Studio 当前不会命中断点的问题

    这个问题一般有两个版本 1.当前不会命中断点,还没有为该文档加载任何符号. 2.当前不会命中断点,源代码与原始版本不同. 要解决第一个问题,就要了解一种文件格式“PDB(Program DataBas ...

  8. wcf契约版本处理与异常处理(随记)

    -----------版本控制策略:必须支持向后兼容:----就是当服务端发生改变,但客户端未更新会不会发生错误: 一旦契约发布,若要契约发生变化,如何不影响客户端使用: ----wsdl:契约: 服 ...

  9. ASP.NET MVC 缓存扩展 - Donut Caching

    项目介绍 ASP.NET MVC Extensible Donut Caching brings donut caching to ASP.NET MVC 3 and later. The code ...

  10. bootstrap悬浮顶部或者底部

    这是bootstrap提供的样式,只需要引入bootstrap.css即可. 需要使用的class样式: navbar navbar-inverse navbar-inner navbar-fixed ...