js 全局变量与局部变量
类别:Web前端 浏览量:388
时间:2014-11-22 js 全局变量与局部变量
js 全局变量与局部变量当JS解析器执行时,首先就会在执行环境里构建一个全局对象,我们定义的全局属性就是做为该对象的属性读取,在顶层代码中我们使用this关键字和window对象都可以访问到它。而函数体中的局部变量只在函数执行时生成的调用对象中存在,函数执行完毕时局部变量即刻销毁。因此在程序设计中我们需要考虑如何合理声明变量,这样既减小了不必要的内存开销,同时能很大程度地避免变量重复定义而覆盖先前定义的变量所造成的Debug麻烦。
一般,js中定义在function外的变量是全局变量;定义在函数当中,但是没有用var声明的是全局变量;定义在函数当中,用var声明的是局部变量。
js 全局变量与局部变量的特性
1、Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)
切记,是function块,而for、while、if块并不是作用域的划分标准
例如
<script>
function test2(){
alert ("before for scope:"+i); // i未赋值(并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行)
// 此时i的值是underfined
for(var i=0;i<3;i++){
alert("in for scope:"+i); // i的值是 0、1、2, 当i为3时跳出循环
}
alert("after for scope:"+i); // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3
while(true){
var j = 1;
break;
}
alert(j); // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1
if(true){
var k = 1;
}
alert(k); //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
}
test2();
//若在此时(function scope之外)再输出只存在于test2 这个function scope里的 i、j、k变量会发生神马效果呢?
alert(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!
alert("这行打印还会输出吗?"); //未执行
alert(j); //未执行
alert(k); //未执行
</script>
2、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域
例如
<script>
var a =1;
function test(){
alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,
//所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,
//函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。
a=4
alert(a); //a为4,没悬念了吧? 这里的a还是局部变量哦!
var a; //局部变量a在这行声明
alert(a); //a还是为4,这是因为之前已把4赋给a了
}
test();
alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>
3、当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope
例如
<script>
var a =1;
function test(){
alert(window.a); //a为1,这里的a是全局变量哦!
var a=2; //局部变量a在这行定义
alert(a); //a为2,这里的a是全局变量哦!
}
test();
alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>
标签:变量
您可能感兴趣
- SQL Server变量
- SQLSERVER 拼接含有变量字符串案例详解(SQLSERVER 拼接含有变量字符串案例详解)
- uniapp 全局变量(如何在uniapp项目中使用mqtt)
- nginx配置使用环境变量(关于Nginx开启gzip的配置的问题)
- sqlserver判断条件输出字符(SQL Server查询条件IN中能否使用变量的示例详解)
- javascript如何建立一个静态变量(JavaScript中子函数访问外部变量的3种解决方法)
- dedecms移动端如何设置(dedecms删除系统自定义变量的方法)
- 深入理解php 变量(不常用但很实用的PHP预定义变量分析)
- python3 for循环怎么用(Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解)
- python中的变量与变量类型(Python变量类型知识点总结)
- C#静态变量、静态方法、静态类
- 如何建立smart组件(Smarty模板变量与调节器实例详解)
- python中三种基本的数值类型(python基础知识一变量与简单数据类型详解)
- python变量与对象的关系(Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析)
- mysql自定义函数怎么设置(MySQL自定义变量?学不废不收费~)
- python的4种数字变量(Python将字符串常量转化为变量方法总结)
- 吉善缘《聚宝金蟾》金蟾招财摆件 三足全铜蟾蜍客厅店铺开业礼品(吉善缘聚宝金蟾金蟾招财摆件)
- 招财化煞神兽,金蟾变了(招财化煞神兽金蟾变了)
- 26岁杨紫的白素贞遇上24岁鞠婧祎,哪个最美(26岁杨紫的白素贞遇上24岁鞠婧祎)
- 鞠婧祎和杨紫两种风格的女生,你心里谁比较美(鞠婧祎和杨紫两种风格的女生)
- 三千年第一美女鞠婧祎出演白素贞pk杨紫,颜值胜赵雅芝王祖贤(三千年第一美女鞠婧祎出演白素贞pk杨紫)
- 成都轨道交通13号线一期工程最新进展(成都轨道交通13号线一期工程最新进展)
热门推荐
- python 文本分析 摘要(用Python逐行分析文件方法)
- dedecms统计功能(DedeCMS sql 调用数字递增标签以及修改方法)
- 解释mysql慢查询(MySQL Threads_running飙升与慢查询的相关问题解决)
- dedecms设置二级域名(织梦DEDECMS中要删除指定IP的评论的方法)
- python怎么进行参数传递(在Python中如何传递任意数量的实参的示例代码)
- WdatePicker日历控件的用法
- mysql按端口查找配置(MySQL中给定父行找到所有子行的解决方案)
- sqlserver数据库文件包括(详解SQL Server数据库状态和文件状态)
- 服务器租用教程(如何选择租用网站服务器?)
- .NET垃圾回收机制是什么
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9