javascript变量作用域使用中常见错误总结


Posted in Javascript onMarch 26, 2013

今天在rainweb的博客上,看到了这篇非常好的文章,觉得非常有必要分享出来,相信大家认真读完这篇文章,对js作用域的理解又会上升到一个新的台阶。

前言:javascript里变量作用域是个经常让人头痛抓狂的问题,下面通过10++个题目,对经常遇到又容易出错的情况进行了简单总结,代码样例很短很简单

题目一

var name = 'casper'; alert(name); //毫无疑问地输出:casper

题目二
alert(name); //报错:对象未定义,即使用一个压根就不存在的变量,所以出错 
age = 24; //这里木有错,但age不是为定义吗?翻下犀牛书,明白了 //给一个未定义的变量赋值,会创建一个全局变量,相当于:var age = 24

题目三
alert(name); //name下面才定义,这里肯定报错了吧?错!这里弹出:undefined 
var name = 'casper';

解释:javascript代码在解析的时候,都会搜索下var声明的变量,并将其声明提前,实际的过程如下:
var name; //光声明name变量,但未赋值,所以为此时为:undefined 
alert(name); name = 'casper';

题目四
var name = 'casper'; 
function show(){ 
alert(name); 
name = 'hello'; //全局变量name的值改为'hello' 
} 
show(); //输出:casper

题目五
var name = 'casper'; 
function show(){ alert(name); //输出:undefined,是不是有想死的心 
var name = 'hello'; //注意:与题目四相比,此处name前多了个var, 
} show();

解释:在函数show中,name是个局部变量,题目三的原理同样适用于此,即函数show内部实际为
(小知识点补充:当函数内部存在与外部全局变量同名的局部变量,优先使用局部变量,此处为name)
function show(){ var name; alert(name); name = 'hello'; }
题目六
var list = [1,2,3]; 
function show(){ if(typeof list === 'undefined') 
{ list = []; } 
alert(list.length); 
}; 
show(); //结果:3,是不是一目了然= =,稍等,请接着看第七题

题目七
var list = [1,2,3]; 
function show(){ 
if(typeof list === 'undefined') 
{ var list = []; //请注意,与题目六相比,这里多了个var 
} alert(list.length); }; 
show(); //结果:0,是不是突然有了想死的冲动

解释:javascript没有块级作用域(即由{}限定的作用域),函数中声明的所有变量,无论在哪里声明,在整个函数中都是有定义的,这点跟C++等灰常不同,赶紧扭转思想与时俱进
于是,再来看下show方法实际的内部解析逻辑
function show(){ var list; //list为局部变量,且此处尚未赋值 
if(typeof list === 'undefined'){ 
list = []; } 
alert(list.length); };

题目八
alert(typeof show); //结果:function,请相信你的眼睛,你没有看错 
function show(){}

解释:javascript代码解析的过程,类似 function show() 这种形式声明的函数,跟var声明的变量一样,都会被提到最前面,不同的是,函数声明跟定义同时完成,但var声明的变量的赋值在后面才会完成
题目九
alert(typeof show); //结果:undefined,请再次擦亮你的眼睛,你的确没有看错 
var show = function(){};

解释:采用函数定义式以及函数表达式定义函数,两者过程之间存在一些区别
函数定义式:function show(){}
函数表达式:var show = function(){}
采用函数定义式声明的方法,函数的定义会提前;而采用函数表达式声明的方法,函数的定义,跟采用var声明的局部变量一样,函数声明会提前,但函数定义位置不变,过程如下:
var show; alert(typeof show); 
show = function(){};

题目十
var data = {name:'casper'}; 
function data(){ alert('casper'); } 
data(); //TypeError: object is not a function

是不是有砸显示器的冲动。。。data此时其实为{name:'casper'},把一个object当函数调用,于是报错了
前面说过,函数声明(通过函数定义式)、var声明的变量会被提前,但是会有先后顺序之分,如下:
function data(){ alert('casper'); 
} var data; data = {name:'casper'}; 
data();

略微修改下,结果就不同鸟:
var data = {name:'casper'}; 
var data = function (){ //通过函数表达式声明函数 
alert('casper'); } 
data(); //结果:casper

结合上文不难猜想过程如下:
var data; data = {name:'casper'}; 
data = function (){ alert('casper'); } 
data(); //结果:casper
Javascript 相关文章推荐
jQuery Ajax之load()方法
Oct 12 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
Jquery修改页面标题title其它JS失效的解决方法
Oct 31 Javascript
Node.js异步I/O学习笔记
Nov 04 Javascript
jQuery中:password选择器用法实例
Jan 03 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
JS使用插件cryptojs进行加密解密数据实例
May 11 Javascript
详解微信小程序Radio选中样式切换
Jul 06 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
Vue对象赋值视图不更新问题及解决方法
Jun 03 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 #Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 #Javascript
jquery 无限级联菜单案例分享
Mar 26 #Javascript
JSON辅助格式化处理方法
Mar 26 #Javascript
html+css+js实现xp window界面及有关功能
Mar 26 #Javascript
jquery图片放大镜功能的实例代码
Mar 26 #Javascript
EditPlus注册码生成器(js代码实现)
Mar 25 #Javascript
You might like
php设计模式 Facade(外观模式)
2011/06/26 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
python线程中同步锁详解
2018/04/27 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
python从PDF中提取数据的示例
2020/10/30 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
迪奥官网:Dior.com
2018/12/04 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
教育学习自我评价
2014/02/03 职场文书
护士实习求职信
2014/06/22 职场文书
儿子满月酒致辞
2015/07/29 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
改造DE1103三步曲
2022/04/07 无线电