一个JavaScript变量声明的知识点

上周四吃完午饭,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。这里就弄晕了,不知道怎么分析和解释了。表明上我觉得我理解了变量声明提前,但是用学到方法分析上面代码段,我会得出错误的结果。那么变量的赋值和在函数外部(全局变量)还是函数内部(局部变量)有关系?

(0)

相关推荐

  • JavaScript 语言基础知识点总结(思维导图)

    JavaScript 数组 JavaScript 函数基础 Javascript 运算符 JavaScript 流程控制 JavaScript 正则表达式 JavaScript 字符串函数 JavaScript 数据类型 JavaScript 变量 Window 对象 DOM 基本操作    由于上面的图片比较大,建议大家下载到本地查看

  • javascript知识点收藏

    1.四种浏览器对 document.body 的 clientHeight.offsetHeight 和 scrollHeight 的解释. 这四种浏览器分别为IE(Internet Explorer).NS(Netscape).Opera.FF(FireFox). clientHeight大家对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关. offsetH

  • js运动动画的八个知识点

    今天简单的学了一下js运动动画,记录一下自己的心得体会,分享给大家. 下面是我整理出来的结果. 知识点一:速度动画. 1.首先第一步实现速度运动动画,封装一个函数,用到的知识是setInterval(function(){ 复制代码 代码如下: oDiv.style.left=oDiv.offsetLeft+10+"px"; },30). 对于这里为什么要用到offsetLeft,我特意百度了一下,我得到的有用信息是: a.offsetLeft和left的相同之处都是表示子节点相对于父

  • js+jquery常用知识点汇总

    一.jquery源码中常见的知识点 1.string,number类型转换的快捷方法 复制代码 代码如下: // @param s为字符串,n为数字 function fn(obj){     //转换为String类型     var s = obj +"";     //转换为number类型     var n = +obj; } 分享一个面试例子: //加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 &

  • javascript Excel操作知识点

    1创建 var XLObj = new ActiveXObject("Excel.Application" ); var xlBook = XLObj.Workbooks.Add; //新增工作簿 var ExcelSheet = xlBook.Worksheets(1); //创建工作表 2.保存表格 ExcelSheet.SaveAs("C:\\TEST.XLS" ); 3.使 Excel 通过 Application 对象可见 ExcelSheet.Appli

  • JS重要知识点小结

    讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原理(包括三个段落): 函数相关(包括 函数传参,带参数函数的调用方式,闭包): 面向对象(包括 对象创建.原型链,数据类型的检测,继承). JS代码预解析原理 复制代码 代码如下: /****************** JS代码预解析原理 ******************/ /* JS代码预解析.变量作用域.作用域链等 应该能作为学习JS语言的入门必备知识. 下边给出些简要解释和一些典型的代码段,若要了解更多,能从网上搜索

  • JavaScript知识点整理

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 首先,还是用比较官方的文字描述来解释下JavaScript: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于

  • 你必须知道的Javascript知识点之"单线程事件驱动"的使用

    复制代码 代码如下: var intervalBody = function(){     console.log('interval'); } var startInterval = function(){     setInterval(intervalBody,1000); } var timeoutBody = function(){     console.log('timeout'); } var startTimeout = function(){     setTimeout(t

  • 一个JavaScript变量声明的知识点

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

  • javascript变量声明实例分析

    本文实例讲述了javascript变量声明的方法.分享给大家供大家参考.具体分析如下: js中使用一个变量之前应当先声明.变量使用关键字var来声明. 如果未在var声明语句中给变量指定初始值,则该变量值为undefined. 不用在声明变量时指定变量类型,js变量可以是任意数据类型. 使用var语句重复声明变量是合法且无害的.如果重复声明带有初始化器,则就和简单的赋值语句没啥区别. 如果试图读取一个没有声明的变量,则js会报错.在ECMAScript5严格模式下,给一个没有声明的变量赋值也会报

  • JavaScript变量声明var,let.const及区别浅析

    var声明变量的作用域限制在其声明位置的上下文中 var x = 0; // x是全局变量,并且赋值为0. console.log(typeof z); // undefined,因为z还不存在. function a() { // 当a被调用时, var y = 2; // y被声明成函数a作用域的变量,然后赋值成2. console.log(x, y); // 0 2 function b() { // 当b被调用时, x = 3; // 全局变量x被赋值为3,不生成全局变量. y = 4;

  • javascript 变量声明 var,let,const 的区别

    目录 作用域(Scope)是什么 var 声明 提升(Hoisting) let 声明 const 声明 作用域(Scope)是什么 作用域是程序的执行环境,它包含在当前位置可访问的变量和函数.在 ES5 语法中,有全局作用域和局部作用域,ES6 则新增了块级作用域. 全局作用域是最外层的作用域,在函数外面定义的变量属于全局作用域,可以被任何其他子作用域访问.在浏览器中,window 对象就是全局作用域.在编写前端代码过程中,其中有一条优化规则就是少使用全局变量,因为全局变量容易导致程序BUG,

  • JavaScript变量声明的var、let、const详解

    目录 前言 内容 JavaScript的变量声明 var的变量声明 变量声明在函数作用域中 变量重复声明 变量声明提升 怪异危险的var let和const的变量声明 块级作用域 不可重复声明 暂时性死区 使用好let和const 总结 参考资料 前言 一个程序语言在运行的过程中,变量的声明在整个程序的生命周期中,是不断在进行的过程.任何程序的计算都会涉及至少一个变量,而计算的结果的则可能会涉及到另外的一个或者多个变量.变量在使用前是要声明,变量声明的过程在计算机的底层,牵涉到的是内存空间和内存

  • 深入理解javascript变量声明

    相对于C/C++来说,ECMAScript里的for循环并不能创建一个局部的上下文. 复制代码 代码如下: for (var k in {a: 1, b: 2}) {   alert(k); } alert(k); // 尽管循环已经结束但变量k依然在当前作用域 任何时候,变量只能通过使用var关键字才能声明.   上面的赋值语句:   a = 10; 这仅仅是给全局对象创建了一个新属性(但它不是变量)."不是变量"并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概

  • JavaScript变量声明详解

    定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量.这里的定义是指通过var声明的. JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性.例如: 复制代码 代码如下: function test(){     myname = "huming";     alert(myname); } test(); // "huming" alert(myname); //"huming" 两个结果是一样的,说明

  • Javascript变量函数声明提升深刻理解

    目录 前言: 变量提升 函数提升 为什么要提升? 最佳实践 总结 前言: Javascript变量函数声明提升(Hoisting)是在 Javascript 中执行上下文工作方式的一种认识(也可以说是一种预编译),从字面意义上看,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,在代码里的位置是不会动的,而是在编译阶段被放入内存中会和代码顺序不一样.变量函数声明提升虽然对于实际编码影响不大,特别是现在ES6的普及,但作为前端算是一个基础知识,必须掌握的,是很多大厂的前端面试必问的

  • JavaScript进阶(一)变量声明提升实例分析

    本文实例讲述了JavaScript变量声明提升.分享给大家供大家参考,具体如下: 如下代码输出的结果是? var num = 123; function foo1(){ console.log( num ); //undefined var num = 456; console.log( num ); //456 } foo1(); Javascript代码执行分为两个大步: 预解析的过程 代码的执行过程 1.预解析与变量声明提升 程序在执行过程中,会先将代码读取到内存中检查,会将所有的声明在此

  • JavaScript的变量声明提升问题浅析(Hoisting)

    一.变量声明提升 hoisting 英['hɔɪstɪŋ] 美['hɔɪstɪŋ] n. 起重,提升 v. 把-吊起,升起( hoist的现在分词 ) 先来看一个栗子 var cc = 'hello'; function foo(){ console.log(cc); var cc = 'world'; console.log(cc); } foo(); console.log(cc); 这里将会输出 undefined.'world' .'hello' 此处主要有两个知识点: 1.作用域 2.

随机推荐