资讯专栏INFORMATION COLUMN

Javascript中变量范围和hoist现象

zhangwang / 783人阅读

摘要:而在语句之前,局部变量确实是。顺便有个网站能在线执行,。不过一直没发现有好的的解释器和调试器,在浏览器里弄略蛋疼。

这个还是自己记一下,在以下这篇文章中也有很好的讲解
http://www.kenneth-truyers.net/2013/04/20/javascript-hoisting-explained/

Javascript中没有block scope,只有函数全局两个范围。
在函数中部声明的变量会被隐式的提升(hoist)到函数头部,比如以下代码

function test() {
    alert(a); // undefined, 注意不是ReferenceError
    while (true) {
        var a = 5;
        break;
    }
    alert(a); // 5
}
test();

这里能两个都能alert出来没有错误是因为,这段代码等同于如下代码

function test() {
    var a; // 把函数中所有局部变量的声明都提升到头部
    alert(a);
    while (true) {
        a = 5;
        break;
    }
    alert(a);
}
test();

这里就要非常小心这种被隐式提升的局部变量和全局变量的一些冲突了,比如下面这段代码

var bird = "sparrow";
function test() {
    if (typeof bird === "undefined") {
        var bird = "pigeon";
    } 
    alert(bird); // pigeon
}
test();

很奇怪吧为什么alert出来是pigeon而不是sparrow, 因为局部变量bird把全局变量遮盖了。而在if语句之前,局部变量bird确实是undefined。
不得不说这很tricky。

顺便有个网站能在线执行js,http://jsfiddle.net。
不过一直没发现有好的js的解释器和调试器,在浏览器里弄略蛋疼。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87625.html

相关文章

  • JavaScript函数纪要(一)

    摘要:中函数是一等公民,所有的函数实际上是一个对象,与其他引用类型一样拥有着属性和方法,也可以被外界或者自身调用,也可以像传递参数一样将函数传递给另一个函数。中函数没有重载的概念,当定义两个同名函数的时候,前一个函数会被覆盖掉,举个栗子。 JavaScript中函数是一等公民,所有的函数实际上是一个Function对象,与其他引用类型一样拥有着属性和方法,也可以被外界或者自身调用,也可以像传...

    plus2047 评论0 收藏0
  • JavaScript 变量声明提升

    摘要:输出的结果为输出的结果为提升后输出的结果为重新定义了变量输出的结果为如果定义了相同的函数变量声明,后定义的声明会覆盖掉先前的声明,看如下代码输出练习的值是多少的值是多少第二题的解析请看这里参考资料文章文章中文版链接文章推荐文章变量提升 JavaScript 变量声明提升 原文链接 一个小例子 先来看个例子: console.log(a); // undefined var a =...

    fireflow 评论0 收藏0
  • JS笔记四:作用域、变量(函数)提升

    摘要:变量作用域一个变量的作用域表示这个变量存在的上下文。在这种情况下,仅仅函数声明的函数体被提升到顶部。虽然我们无需用来修饰形式参数,但是形式参数的确也是变量,并且被自动提升到次高的优先级函数声明。 关于作用域,变量提升,函数提升的个人理解 参考: 阮一峰的JavaScript参考教程2.7函数部分 思否上一篇关于作用域,提升的博客 一篇关于作用域和提升的个人博客 MockingBird...

    FuisonDesign 评论0 收藏0
  • 译: 函数提升与提升面试的相关问题

    摘要:函数提升在里有两种方式创建函数,通过函数声明和函数表达式。函数声明用指定的参数来定义函数。提示不要在中进行函数声明。问题输出两个都是用函数声明的函数,将被提升到的局部作用域顶端。函数本身将作为函数声明在全局范围内提升。 作者关于提升的话题,总共有两篇。(后来又有一个讨论篇),再次搬过来。水平有限,如果翻译的不准确请包涵,并去看原文。下面开始: 这是我之前的关于提升的文章,标题为《用le...

    wuaiqiu 评论0 收藏0
  • JavaScript变量提升的相关讨论

    摘要:函数和变量声明总是用这样的方式被提升,变量的赋值将在代码中的任何位置出现。然而,这里输出的是就是这个原因我认为变量声明没有提升。变量声明在函数声明之后或者下面被提升。这是个关于变量提升的简单又又明确例子这被理解为现在明白了。 2017年的事情还是2017年完成吧。话不多说,现在开始: 之前翻译过两篇发表在Medium上的两篇文章,关于变量和函数提升的问题。后来发现,一个读者(Gavin...

    gxyz 评论0 收藏0

发表评论

0条评论

zhangwang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<