一个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 相关文章推荐
jquery中this的使用说明
Sep 06 Javascript
javascript hashtable 修正版 下载
Dec 30 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
Jan 02 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
详解vue项目中实现图片裁剪功能
Jun 07 Javascript
webpack优化之代码分割与公共代码提取详解
Nov 22 Javascript
基于Electron实现桌面应用开发代码实例
Jul 07 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 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
php表单转换textarea换行符的方法
2010/09/10 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
js实现图片实时时钟
2020/01/15 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python 运算符 供重载参考
2009/06/11 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
协议书范文
2015/01/27 职场文书
年会邀请函范文
2015/01/30 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis
redis lua限流算法实现示例
2022/07/15 Redis