javascript权威指南 学习笔记之变量作用域分享


Posted in Javascript onSeptember 28, 2011

不知道,大家对语言中变量的“声明”与“定义”是怎么理解的,
我的理解如下:
“声明”变量,只是仅仅声明,而“定义”变量,指声明了,并且赋值了。
例如:

var name;//只是声明 
var num = 11;//声明,并且赋值,即定义了 
var password = "yangjiang";//声明,并且赋值,即定义了

下面是几点总结:
变量的作用域:全局的和局部的。(注意:如果尝试读取一个未声明的变量的值,javascript会生成一个错误)
第一点:在都使用var关键字修饰变量的情况下,如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,
那么就有效地隐藏了这个全局变量。
例如:
var scope1 = "global";//var修饰 
function checksScope(){ 
var scope1 = "local";//var修饰 
document.write(scope1); 
}checksScope();//local

第二点:如果尝试给一个未用 var 关键字声明的变量,那么,隐式声明的变量总是被创建为全局变量,即使
该变量只在一个函数体内使用(只有该函数运行了,才会发生作用),注意不支持函数嵌套的情形。
例如:
scope2 = "globalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量) 
function checkScopeA(){ 
scope2 = "localAAAAA";//没有使用var修饰(js会默认将其声明为全局变量) 
document.write("<br/>"+scope2); 
myscope = "myLocalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量) 
document.write(","+myscope); 
} 
checkScopeA();//localAAAAA,myLocalAAAAA *A 
document.write("<br/>"+scope2);//localAAAAA *B 
document.write("<br/>"+myscope);//myLocalAAAAA *C

如果将上面的例子中的 *A处的代码注释掉,
例如:
scope2 = "globalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量) 
function checkScopeA(){ 
scope2 = "localAAAAA";//没有使用var修饰(js会默认将其声明为全局变量) 
document.write("<br/>"+scope2); 
myscope = "myLocalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量) 
document.write(","+myscope); 
} 
//checkScopeA(); *A 
document.write("<br/>"+scope2);//globalAAAAA *B 
document.write("<br/>"+myscope);//发生错误 *C

因为函数checkScopeA没有执行,所以 *B处输出为globalAAAAA;
因为函数checkScopeA没有执行,所以变量myscope没有声明,如果尝试读取一个未声明的变量,会发生错误。
第三点:
在javascript中,函数的定义是可以嵌套的。由于 每个函数都有它自己的局部作用域,所以有可能出现几个局部作用域的嵌套层。
例如:
var scope3 = "global scope"; //定义了一个全局变量 
function checkScopeB(){ 
var scope3 = "local scope"; //定义了一个局部变量,覆盖了全局变量scope3 
function nested(){ 
var scope3 = "nested scope"; //在函数的函数的内部,定义了一个局部变量 
document.write("<br/>"+scope3); //nested scope 
} 
nested(); 
} 
checkScopeB();//nested scope

第四点:
在javascript中,没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有声明的。
在javascript中,没有块级作用域,函数中定义的所有变量,无论是在哪里定义的,在整个函数中它们都是有定义的。
例如:
function test(o){//根据以上的说明:此函数中的i,j,k三个变量的作用域是相同的。 
var i = 0; //变量 i 在整个函数中都有定义 
if(typeof o == "object"){ 
var j = 0 ; //变量 j 在整个函数中都有定义,而不仅仅是在 if 语句块 
for(var k=0;k<10;k++){//变量 k 在整个函数中都有定义,而不仅仅是在 if 语句块 
document.write("<br/>k的值为:"+k); 
} 
document.write("<br/>for循环外k的值:"+k);//此时的 k 仍然被定义了,k=10 
} 
document.write("<br/>j的值:"+j); //变量 j 被声明了,但可能没有被初始化 因为可能往函数中 传入的参数 不是对象 ,if语句块不会执行 
}

下面通过两种方式调用此函数:
方式一:传入对象
test({});//输出结果:上例中的注释
方式二:什么都不传
test();//输出结果:j的值:undefined
想不明白的是,在第二种方式中的输出结果,为什么会是 undefined。我当时猜的是:j的值:0
后来,这本书上面说:
由于局部变量在整个函数体内都是有声明(或定义)的,这就意味着在整个函数体中都隐藏了同名的全局
变量。虽然 局部变量在整个函数体内中都是有声明(或定义)的,但是在执行var语句之前,它是不会被初始化的。
这样的话,上面的方式二调用的输出结果,就比较好解释了,由于变量j在整个函数中都有定义,而又由于传入函数的参数为空,所以函数体中的if语句不会执行,从而使得j的值为undefined.(这是我参照上面书上说的那句话的理解)
下面的例子,更好的说明:
var sssss = "全局变量"; 
function f(){ 
document.write("<br/>"+sssss);//输出:undefined 而不是输出"全局变量" 
var sssss = "局部变量"; 
document.write("<br/>"+sssss);//输出:局部变量 
}
Javascript 相关文章推荐
转一个日期输入控件,支持FF
Apr 27 Javascript
Webkit的跨域安全问题说明
Sep 13 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
js实现导航吸顶效果
Feb 24 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
JavaScript递归算法生成树形菜单
Aug 15 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
JavaScript实现拖拽功能
Feb 11 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 Javascript
微信小程序点击滚动到指定位置的实现
May 22 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 #Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
Sep 27 #Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
Sep 26 #Javascript
一个挺有意思的Javascript小问题说明
Sep 26 #Javascript
Jquery之Ajax运用 学习运用篇
Sep 26 #Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 #Javascript
在Windows上安装Node.js模块的方法
Sep 25 #Javascript
You might like
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
python网络编程之文件下载实例分析
2015/05/20 Python
Python实现网站注册验证码生成类
2017/06/08 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python sort、sort_index方法代码实例
2019/03/28 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
python英语单词测试小程序代码实例
2019/09/09 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
奖学金感谢信
2015/01/21 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang