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 相关文章推荐
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
Dec 14 Javascript
js如何获取object类型里的键值
Feb 18 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
May 06 Javascript
javascript原型模式用法实例详解
Jun 04 Javascript
javascript中一些util方法汇总
Jun 10 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
Dec 09 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
js实现鼠标移动到图片产生遮罩效果
Oct 21 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
定时器(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的人气开发框架Laravel
2015/10/15 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
js子页面获取父页面数据示例
2014/05/15 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
Python实现多线程下载文件的代码实例
2014/06/01 Python
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Python实现登陆文件验证方法
2018/10/06 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
Django权限控制的使用
2021/01/07 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
教师考察材料范文
2014/06/03 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
同学会邀请函模板
2015/01/30 职场文书
借钱欠条怎么写
2015/07/03 职场文书
高二数学教学反思
2016/02/18 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL