一个JavaScript变量声明的知识点


Posted in Javascript onOctober 28, 2013

上周四吃完午饭,leader发了一道JavaScript的题目给我们做,我们Team里面有做前端的,有做后台的,也有坐mobile web的,所以大家对题目的理解各自都不一样,然后在QQ讨论组里面进行讨论。发现虽然很基础,但是通过讨论收获不少,分享出来。当然在有开发经验的开发者看来,这些都是学习JavaScript最基础的东西。因为平时都是用jQuery或者第三JS组件,所以对JavaScript基础学习不够重视。题目如下,问题是:2次alert分别输出什么结果?

<script
type="text/javascript">
    var a = 1;
    var a;
    alert(typeof a);
    (function () {
        b = '-----';
        var b;        
    })();
    alert( typeof b);
</script>

我的答案是:1.undefined 2.undefined。然后leader让我们再仔细考虑一下问题答案。我对题目的分析:
1.声明a并赋值为1,然后用重新声明a,但是此时没有赋值,那变量默认值应该为undefined。
2.b变量是在函数里面是局部变量,alert里面输出的是全局变量b,所以为undefiend。
我自己在Chrome里面运行了一下代码,代码正确结果是1.number 2.undefined。这里考察的是JavaScript的变量声明提前概念。
我们在看另外一个例子,比如下面:
test();
function test(){
    alert("Hello World!");
}

程序不会报错,而已运行结果是:Hello World!。原理:计算机在开始执行语句之前,会先查找所有的function定义,然后保存相关的function。
第1题:
var a = 1;
var a;
第2行声明变量a,就相当于在顶部声明了a,然后第一句是重新声明a,然后赋值为1。所以typeof a为number
第2题:
b = '-----';
var b;
第二题解析:b=‘-----',程序首先会去查找上下文是否有变量b的声明,如果有的话,直接赋值为'-----'。但是alert( typeof b); 是在函数外面,输出的全局变量b,所有是undefined。
请注意:对变量的赋值操作并没有提前。
接着看如下代码段:
<script type="text/javascript">
name="aaa";
function test(){
    alert(typeof name);    var name="bbb";
    alert(typeof name);
}
test();
</script>

请写出结果。
分析可以写成如下代码段:
name="aaa";
function test(){
    alert(typeof name);//在函数内部查找上下文是否有name的声明,有声明。但是赋值操作不能提前,所以类型为undefined
    var name="bbb";//赋值操作
    alert(typeof name);//string
}
test();

但是下面代码段,运行结果是什么?
<script type="text/javascript">
alert(typeof name);
var name="hello world";
alert(typeof name);
</script>

程序运行结果是:string,string。这里就弄晕了,不知道怎么分析和解释了。表明上我觉得我理解了变量声明提前,但是用学到方法分析上面代码段,我会得出错误的结果。那么变量的赋值和在函数外部(全局变量)还是函数内部(局部变量)有关系?
Javascript 相关文章推荐
JS 时间显示效果代码
Aug 23 Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
基于javascript实现文字无缝滚动效果
Mar 22 Javascript
js实现图片加载淡入淡出效果
Apr 07 Javascript
基于JavaScript实现选项卡效果
Jul 21 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
React路由管理之React Router总结
May 10 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 Javascript
如何基于jQuery实现五角星评分
Sep 02 jQuery
JavaScript组合继承详解
Nov 07 Javascript
Javascript实现页面跳转的几种方式分享
Oct 26 #Javascript
javascript中简单的进制转换代码实例
Oct 26 #Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 #Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 #Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 #Javascript
使用 Node.js 做 Function Test实现方法
Oct 25 #Javascript
详细介绍8款超实用JavaScript框架
Oct 25 #Javascript
You might like
提问的智慧(2)
2006/10/09 PHP
需要发散思维学习PHP
2009/06/29 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP 实现重载
2021/03/09 PHP
javascript 写类方式之十
2009/07/05 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python Subprocess模块原理及实例
2019/08/26 Python
python十进制转二进制的详解
2020/02/07 Python
简历自荐信
2013/12/02 职场文书
大学校庆邀请函
2014/01/11 职场文书
小学生综合素质评语
2014/04/23 职场文书
品质口号大全
2014/06/17 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
部分武汉产收音机展览
2022/04/07 无线电