关于javascript变量作用域的研究。
开始
一个变量的作用域(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变量作用域的研究。的更多相关文章
- 【转】javascript变量作用域、匿名函数及闭包
下面这段话为摘抄,看到网上大多数人使用的是变量在使用的时候声明而不是在顶端声明,也可能考虑到js查找变量影响性能的问题,哪里用就在哪里声明,也很好. 在Javascript中,我们在写函数的时候往往需 ...
- php中include文件变量作用域的研究
原文:php中include文件变量作用域的研究 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件 ...
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- JavaScript 变量作用域
一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...
- JavaScript变量作用域
全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返 ...
- 深入理解Javascript变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- JavaScript 变量作用域 详解
变量作用域要点 - 在JavaScript中没有块级作用域,只有函数作用域 - 在函数体内,局部变量的优先级高于同名的全局变量 - 在全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用v ...
- JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识
在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量 ...
- 基础系列(1)之干掉JavaScript变量作用域
今天去某顺公司面试,发现一些基础知识都不记得了,于是乎决定把js基础系列的全部梳理一遍,今天就整理下js变量作用域的相关基础知识点,配合最常遇到的笔试题阐述. 题一: var g = "a ...
随机推荐
- ie6、ie7真的不支持inline-block吗?
本来今天想出JavaScript继承的博文的,由于也才刚学习不久,以及工作比较忙,所以暂推两天写JavaScript的继承,喜欢的童鞋们关注我的博客哟! okay,言归正传.之前在接触前端的时候,处理 ...
- 它们的定义android滑动菜单
在这里实现了两个滑动菜单效果,的拖放内容的第一部分,菜单拖出像这样的效果感觉,另一种是拖动内容.后面的内容固定菜单.我感觉有层次感的效果,如下面 第一种效果的代码实现例如以下: package com ...
- .NET的DTO映射工具AutoMapper
.NET的DTO映射工具AutoMapper 原文:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started 参考:http://ww ...
- Oracle执行计划——Oracle 如何启用执行计划
AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计.SQL*Plus AUTOTRACE可以用来替代SQL Trace使用,AUTOTR ...
- .NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器
.NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器 北京时间今天凌晨的 Connect(); 大会上,多少程序员的假想成为现实. ...
- jquery 超简单的点赞效果
1.HTML(可以优化一下,尽量少些几个标签.....) <div id="dianz"> <b class="cz"><em&g ...
- SQL Server 远程链接服务器详细配置
原文:SQL Server 远程链接服务器详细配置[转载] http://hi.baidu.com/luxi0194/blog/item/a5c2a9128a705cc6c2fd7803.html - ...
- HDInsight-Hadoop现实(两)传感器数据分析
HDInsight-Hadoop现实(两)传感器数据分析 简要 现在,含传感器非常个人和商用设备收集来自物理世界的信息.例如.大多数手机都有 GPS.健身器材可以跟踪的步骤,你去数,恒温控制器可以监视 ...
- form-validation--表单验证插件
基于jquery的validationEngine表单验证插件,根据官网提示,该插件支持IE6-8,Chrome浏览器,火狐,Safari,Opera 10,但由于有使用到了css3的阴影和圆角样式, ...
- ASP.NET WebApi 开放数据
概述 开放式数据协议(OData) 是用于在 web 数据访问协议.它提供统一的方式来构造数据. 查询的数据和操纵数据集通过 CRUD 操作.它支持 AtomPub (XML) 和 JSON 格式.它 ...