javascript变量:全局?还是局部?这个得注意!
做项目就是一个学习的过程!
做为一个学习C3年多,从C程序员转前端的人来说,javascript中的许多规则是没办法或者说一时半会理解不了的。
今天就遇到了一个,大致就是这么个代码。
var a ; //全局变量
function fun()
{
alert(a); // a 在其它地方赋值,在这里操作,比如赋值为 0 ------------- 1
if(a==0)
{
alert(a); // ----------------2
a = 10;
}
var a = 5 ; // 重新定义变量
alert(a); // -----------------3
}
function fun2()
{
alert(a) // ------------------4
}
// 先执行了赋值,然后执行fun(),执行fun2();
结果第2处的操作怎么都进入不了,于是打出第1处直接 a 的值是: undefined !,我C,这是什么情况?
可能是C的理论,在脑海里扎的太深了,想了很久也想不明白为什么,只好在网上查,还好不是我一个人遇到这样的问题,在网上查了三篇文章。
javascript 变量范围 ()全局变量的作用域是全局性的,即在整个Javascript程序中,全局变量作用处处都存在。定义在”script”块中,在”function”函数外。
()局部变量的作用域是局部性的,在函数内部或函数参数时定义,作用范围是从函数开始到结尾(注意此处说法)
()在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量(包括参数),那么该全局变量将不再起作用。
看到这个的时候,我貌似有点点明白了。
也就是说我在 标注3 处的定义,跟放在fun第一行定义没有区别的,因为只要函数内部定义了,它的作用范围就是从开始到结尾(定义时候没有赋值,所以Undefined)。
顺便又看了一些深一点的知识。
JavaScript语言块的范围跟其它(比如C)是不同的,它是用function来划分的,称为方法块(是根据后面的{}来划分)。
也就是说for,while,等内部定义的变量,虽然有{},但出了{},还是有效的。
例:q,x,y,z 分别在函数的不同位置定义,但他们的作用范围是相同的,都相当于在函数开始定义的,好神奇,也好TMD的难理解呀,有么有?
function test(q)
{
// 在整个函数中,x都有意义
var x=0;
if(typeof(q)=="object")
{
//y不仅在if块中有意义,在整个函数中都有意义
var y=0;
for(var z=0;z<5;z++)
{
//z不仅在for循环中有意义,在整个函数中都有意义
document.write(z);
}
document.write(z); //z仍旧有意义,输出5
}
document.write(y); //y仍旧有意义
} // 问题:如果在这里 alert(x) 会怎么样呢?
根据上面的三点应该很容易看出来:如果在函数外面 alert(x) ,会出现致命错误,脚本停止!因为x在函数外面是没有定义的。
那么,当局部变量与全局变量重名时候,怎么获取全局变量的值呢?
哈哈,最简单的当然是避免全局变量与局部变量相遇咯!
此外,用window.全局变量名
例子:
<script>
var a =0; // 全局a定义
function test(){
alert(window.a); //a为1,这里的a就取的是全局变量
var a=2; //局部变量a定义
alert(a); //a为2,这里的a是局部变量!
}
test();
alert(a); //全局的a,当然也可以用window.a
</script>
至此,问题也算搞明白了!
javascript变量:全局?还是局部?这个得注意!的更多相关文章
- [ python ] 全局和局部作用域变量的引用
全局与局部变量的引用 (a)locals(b)globals 这里还需要在补充2个关键字一起比较学习,关键字:(c)nonlocal(d)global locals 和 globals locals: ...
- js变量搜索(先局部,后全局;先解析,后赋值)
var a=10; (function(){ alert(a); })() 变量先搜索局部,没有局部变量,会搜索全局变量 var a=10; (function(){ var a=20; alert( ...
- JavaScript 变量作用域
一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...
- JavaScript - 变量,作用域,内存
JavaScript 变量可以用来保存两种类型的值:基本类型值和应用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Bollean.Number和String. 所有变量都 ...
- javascript 变量,作用域,内存管理小结
js的变量保存两种类型的数据——基本数据类型与引用类型.具有以下几点特征: 变量: 1)基本类型值在内存中占固定大小的空间,因此被保存在栈内存中; 2) 把保存基本类型值得变量赋给另一个变量,会创 ...
- 六天玩转javascript:javascript变量与表达式(1)
说明 本系列属于进阶系列,语常用语法等不在本系列介绍范围之内. 在我刚开始做一个程序员并开发项目的时候,我总是喜欢使用开发语言的各种特性,每次m$发布新版C#的时候我总是会把开发者预览版下好,亲自体验 ...
- 【转】javascript变量作用域、匿名函数及闭包
下面这段话为摘抄,看到网上大多数人使用的是变量在使用的时候声明而不是在顶端声明,也可能考虑到js查找变量影响性能的问题,哪里用就在哪里声明,也很好. 在Javascript中,我们在写函数的时候往往需 ...
- 2015第35周五JavaScript变量
java语言里有一句很经典的话:在java的世界里,一切皆是对象. Javascript虽然跟java没有半点毛关系,但是很多会使用javascript的朋友同样认为:在javascript的世界里, ...
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- JavaScript变量相关问题
本文重在探讨JavaScript变量包含的两种不同数据类型的值--基本类型值和引用类型值的区别.在此外稍微带过ECMAScript和JavaScript的关系. 题为JavaScript变量,但更具体 ...
随机推荐
- cocos2d-x精灵移动的方法
1.飞机发射子弹型 想要实现子弹的的飞行效果,又不想在每帧Update里计算位置,最好的方法调用CCMoveTo 例在发射子弹的时机,能够ccTouchBegan时: CCMoveTo* move = ...
- Robotium API -- 除click/clickLong外的其他操作
拖动操作 void drag (float fromX, float toX, float fromY, float toY, int stepCount) 选定两个位置,进行拖动操作(这里的拖动操作 ...
- Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个xml或者数据库里面, 但我们这里的是读取到xml里面的. 首先我 ...
- ios 中如何应对UIScrollView快速滑动(暴力用户,暴力测试)
1.实现UIScrollViewDelegate 开始滑动: - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 滑动 ...
- CSS3 target 伪类不得不说那些事儿(纯CSS实现tab切换)
是不是觉得target有点眼熟?! 今天要讲的不是HTML的<a>标签里面有个target属性. target伪类是css3的新属性. 说到伪类,对css属性的人肯定都知道:hover.: ...
- mysql慢查优化总结
1.优化sql语句结构 or改成union,使用start,limit 先只查询出所有的id,然后再排序.如果查询出所有的id仍然很慢,就要仔细考虑了. 2.添加索引 mysql每次查询只能使用一个索 ...
- linux下zip命令使用
linux zip命令 zip -r myfile.zip ./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzipunzip -o ...
- linux free命令建检查内存状态
前端时间发现博客服务器物理内存使用过高问题,就是使用linux free命令检查的,这次详细介绍下这个命令. 命 令: free 功能说明:显示内存状态.语 法: free [-bkmotV][-s ...
- Android开发手记(11) 滑动条SeekBar
安卓滑动条的操作特别简单,通过getProgress()可以获得SeekBar的位置,通过setProgress(int progress)可以设置SeekBar的位置.要想动态获取用户对SeekBa ...
- minus的用法
简单的说就是去同留异. MINUS 指令是运用在两个 SQL 语句上.它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中.如果有的话,那这一笔资料就被去除,而 ...