一个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 相关文章推荐
javaScript对象和属性的创建方法
Jan 15 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
Jan 15 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
常用js字符串判断方法整理
Oct 18 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
jquery实现选中单选按钮下拉伸缩效果
Aug 06 Javascript
BootStrap tooltip提示框使用小结
Oct 26 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 Javascript
D3.js实现简洁实用的动态仪表盘的示例
Apr 04 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
Nov 25 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
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
详解NODEJS的http实现
2018/01/04 NodeJs
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
Python实现将xml导入至excel
2015/11/20 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
Python交互环境下实现输入代码
2018/06/22 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
python第三方库学习笔记
2020/02/07 Python
如何理解python中数字列表
2020/05/29 Python
python如何编写win程序
2020/06/08 Python
中国电视购物:快乐购
2017/02/04 全球购物
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
本科生求职简历的自我评价
2013/10/21 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
学校宣传标语
2014/06/18 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
学生评语集锦
2015/01/04 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
农村老人去世追悼词
2015/06/23 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
JavaScript组合继承详解
2021/11/07 Javascript
什么是css原子化,有什么用?
2022/04/24 HTML / CSS