开始

一个变量的作用域(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. MVC5+ 路由特性

    MVC5+ 路由特性 概述 ASP.NET MVC 5支持一种新的路由协议,称为路由特性. MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 案例 1.使用Visua ...

  2. [Node.js框架] 为什么要开发 Codekart 框架

    两年前,在被php的$符号和字符串处理折磨得半夜骂娘之后,我义无反顾地决定:珍爱生命,远离php. 之后一直在寻找一门“完美的语言”,先后接触了Lisp.python.java.Ruby.Lisp几乎 ...

  3. HBuilder CSS 自定义代码块

    =begin 本文档是CSS代码块的编辑文件.注意不要把其他语言的设置放到css里来. HBuilder可使用ruby脚本来编辑代码块和增强操作命令. 1.编辑代码块 如果要新增一个代码块,复制如下一 ...

  4. Mvc 下载文件

    你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式.每当你需要以流的方式将 ...

  5. NET Socket服务编程

    smark https://github.com/IKende/ .NET Socket服务编程之-高效连接接入编 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务 ...

  6. DDD分层架构之领域实体(验证篇)

    DDD分层架构之领域实体(验证篇) 在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识.相等性比较.输出实体状态等.本文将介绍领域实体的一个核心内容—— ...

  7. leetcode第37题--Count and Say

    题目:(据说是facebook的面试题哦) The count-and-say sequence is the sequence of integers beginning as follows:1, ...

  8. 反射导出excel案例

    1.代码案例: protected void btnExportExcel_Click(object sender, EventArgs e) { SetSearchValue(); Dictiona ...

  9. 开启apache服务

    安装后如果需要手动添加Sevice,可以按照如下方法: Apache版本:httpd-2.2.15_win32 Apache Service Monitor 提示:“No services insta ...

  10. C# 导入导出excel文件案例

    个人总结导出excel报表的案例: //导出报表 protected void btnExport_Click(object sender, EventArgs e) { List<ProOut ...