一个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 相关文章推荐
IE和FireFox(FF)中js和css的不同
Apr 13 Javascript
checkbox 复选框不能为空
Jul 11 Javascript
为指定元素增加样式的js代码
Dec 09 Javascript
由Javascript实现的页面日历
Nov 04 Javascript
JS调用页面表格导出excel示例代码
Mar 18 Javascript
一个简单的动态加载js和css的jquery代码
Sep 01 Javascript
jQuery CSS3相结合实现时钟插件
Jan 08 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
Dec 01 Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 Javascript
vue使用map代替Aarry数组循环遍历的方法
Apr 30 Javascript
浅谈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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php 魔术函数使用说明
2010/02/21 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python 爬虫网页登陆的简单实现
2020/11/30 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
会计学毕业生求职信
2014/06/25 职场文书
公司借款担保书
2015/09/22 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
开网店计划分析
2019/07/30 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
nginx内存池源码解析
2021/11/20 Servers
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang