`

变量提升

 
阅读更多

看一个有趣的例子,它显示了关于局部和全局作用域的一个重要问题:

 

    var a =123;
    function f() {
        console.log(a);
        var a = 1;
        console.log(a);
    }
    f();

        您可能会想当然的认为console.log()第一次显示123(也就是全局变量a的值),第二次显示1(即局部变量a)。但事实并非完全如此,查看firebug输出结果,如下:

> undefined
> 1
 

      这是因为函数域始终优于全局域,所以局部变量a会覆盖掉所有与它同名的全局变量,尽管在console.log()第一次被调用时,a还没有被正式定义(即该值为undefined),但该变量本身已经存在于本地空间了。这种特殊现象叫做提升(hoisting)。

    也就是说,当Javascript执行过程进入新的函数时,这个函数内部声明的所有变量都会被移动(或者说提升)到函数最开始的地方。这个概念很重要,必须牢记。另外需要注意的是,被提升的只有变量声明,这意味着,只有函数体内声明的这些变量在该函数执行开始时就存在,而与之相关的赋值操作并不会被提升,它还在原来的位置上。上述例子可以被等价的写为:

 

    var a =123;
    function f() {
        var a; // some as: var a= undefined;
        console.log(a); // undefiend;
        var a = 1;
        console.log(a); // 1
    }

 

     再看一个有趣的例子:

    console.log('global1:'  + window.a);
    function hehe()  {
        console.log('func area1:' + window.a);
        console.log('func area2:' + a);
    }
    hehe();
    console.log('global2:'  + window.a);

 您可能认为输出结果是这样的:

> global1: undefined
> func area1: undefined
> func area2: undefiend
> global2: undefined
 

通过查看firebug控制台,实际结果是这样的:

> global1:undefined
> func area1:undefined
> ReferenceError: a is not defined

 

    在输出func area1的时候出错了。为什么func area1 和func area2不同呢,a不应该是全局变量吗?如果因为未定义而出错,那window.a为啥不出错?

    原来,在javascript里,如果访问的对象的属性不存在,代码就会返回undefiend,window.a属于不存在的属性,所以返回undefined,而a属于不存在的变量,故出错,二者性质不通,把window.a改成其他对象效果是一样的:

    var o = {};
    console.log(o.v);

 

 

分享到:
评论

相关推荐

    【JavaScript源代码】JavaScript中变量提升和函数提升实例详解.docx

    变量提升和函数提升在JavaScript中的应用 JavaScript是一种基于对象的脚本语言,广泛应用于Web开发中。其中,变量提升和函数提升是JavaScript语言中两个非常重要的概念。变量提升和函数提升是JavaScript语言的核心...

    JS变量提升及函数提升实例解析

    主要介绍了JS变量提升及函数提升实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JavaScript中变量提升和函数提升的详解

    第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升。这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下。 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3....

    JS变量提升原理与用法实例浅析

    本文实例讲述了JS变量提升。分享给大家供大家参考,具体如下: 该篇介绍什么是变量提升,写给像我一样的JS新手看的 简单来说变量提升就是 JS会把var变量的声明自动提升到作用域的顶部,即使你不想这样 一个例子: (局部...

    JavaScript 变量提升 | 执行上下文 | 作用域

    文章目录变量提升执行上下文全局执行上下文函数执行上下文执行上下文栈作用域例题举个栗子 执行上下文栈:举个栗子 变量提升+执行上下文栈:举个栗子 预处理顺序举个栗子 预处理举个栗子 顺序执行举个栗子 作用域举...

    基于js的变量提升和函数提升(详解)

    一、变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。 上个简历的例子如: console.log...

    JavaScript中的变量提升与函数提升

    相信大家在学习JS的过程中,会遇到一个词,叫做“预解析”,什么是预解析呢,预解析就是说我程序在执行前,会先检查代码有没有语法错误,就是...声明提升包括两个部分,就是变量提升与函数提升。 首先我们先来看变量提

    论文研究-基于多变量提升度量在Apriori算法中的研究与应用 .pdf

    基于多变量提升度量在Apriori算法中的研究与应用,高乾,吕成兴,关联规则挖掘是数据挖掘的一个重要研究方向。传统关联规则使用支持度-置信度框架来进行数据挖掘,所得到的规则并不一定全都是用��

    07-变量提升:JavaScript代码是按顺序执行的吗?_For_vip_user_0011

    介绍,现在你只需要知道,在执上下中存在个变量环境的对象变量环境的对象(ViriableEnvironment),该对象中保存了变量提升的内容,如上代码中的变量

    详解javascript中的变量提升和函数提升

    主要介绍了详解javascript中的变量提升和函数提升的相关资料,需要的朋友可以参考下

    最通俗易懂的javascript变量提升详解

    下面小编就为大家带来一篇最通俗易懂的javascript变量提升详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    JavaScript变量提升和严格模式实例分析

    主要介绍了JavaScript变量提升和严格模式,结合实例形式分析了javascript变量提升和严格模式的原理及相关操作注意事项,需要的朋友可以参考下

    javascript变量提升和闭包理解

    本篇文章给大家详细分析了javascript变量提升和闭包的相关知识点,对此有兴趣的朋友可以参考下。

    JavaScript中变量提升与函数提升经典实例分析

    本文实例讲述了JavaScript中变量提升与函数提升。分享给大家供大家参考,具体如下: 从两个实例说起: eg1: var i; console.log(i); // 2 eg2: console.log(i); // undefined var i = 2; 1、提升 变量和函数...

    JavaScript中Hoisting详解 (变量提升与函数声明提升)

    本文主要给大家介绍了关于JavaScript中Hoisting(变量提升与函数声明提升)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 如何将 函数声明 / 变量 “移动” 到作用域的顶部。 术语 ...

    Agent-No-29#technical-summary#变量提升-代码运行1

    函数声明式会提升到作用域最前边函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升函数体中拥有的变量会优先使用,即:var name =

Global site tag (gtag.js) - Google Analytics