美文网首页
预解析:Javascript中在函数内部使用var声明变量的问题

预解析:Javascript中在函数内部使用var声明变量的问题

作者: Gnomo | 来源:发表于2017-01-03 16:10 被阅读113次

JavaScript中,可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个全局变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。
对于JavaScript,只要变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。
看下面这个例子:

myname = "global"; // 全局变量
function func() {
  alert(myname); // "undefined" 
  var myname = "local";
   alert(myname); // "local"
}
func();

在这个例子中,可能会以为第一个alert弹出global,第二个弹出local。这种期许是可以理解的,因为在第一个alert 的时候,myname未声明,此时函数肯定很自然而然地看全局变量myname,但是,实际上并不是这么工作的。第一个alert会弹 出”undefined”是因为myname被当做了函数的局部变量(尽管是之后声明的),所有的变量声明当被悬置到函数的顶部了。因此,为了避免这种混 乱,最好是预先声明你想使用的全部变量。
上面的代码片段执行的行为可能就像下面这样:

myname = "global"; // global variable
function func() { 
  var myname; // 等同于 -> var myname = undefined;
  alert(myname); // "undefined" 
  myname = "local"; 
  alert(myname); // "local"
}
func();

在执行层面上,代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数创建,这是一个解析和进入上下文 的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被创建。但是,出于实用的目的,我们就采用了”hoisting”这个概念, 这种ECMAScript标准中并未定义,通常用来描述行为。

相关文章

  • 预解析:Javascript中在函数内部使用var声明变量的问题

    JavaScript中,可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行...

  • 7 js 变量

    13 局部 JavaScript 变量在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以...

  • JavaScript中的预解析

    在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析),我相信很多同学在刚开始学JavaScrip...

  • 2020-05-28 vue-admin-ui总结

    作用域:var在函数里定义的才是局部变量。直接使用变量不声明则是隐式全局变量,函数里也是全局的预解析:变量声明提升...

  • JavaScript函数_07 私有变量 + 私有函数 + 特权

    私有变量 使用 var 关键字声明在函数内部的变量称为私有变量 私有函数 在函数内部声明的函数称为私有函数 特权方...

  • var 与let

    1.声明提升 使用var 声明变量,声明会提升到顶部 使用let 声明变量不会提前 在函数内部用var声明变量,只...

  • ES6中let 和 const 的新特性

    在javascript中,我们都知道使用var来声明变量。javascript是函数级作用域,函数内可以访问函数外...

  • 作用域

    变量声明提升 在 JavaScript 中,函数声明(function aa(){})与变量声明(var)经常被 ...

  • Go学习日志:基本概念及通道

    变量声明 简短声明方法,使用:=,在函数内部使用,外部无法通过。 全局变量 使用var来定义。 函数调用 func...

  • 函数

    预解析: 变量和函数的预解析 预解析把变量的声明提前(但不赋值) 函数名加括号调用函数 预解析把函数声明和调用都提...

网友评论

      本文标题:预解析:Javascript中在函数内部使用var声明变量的问题

      本文链接:https://www.haomeiwen.com/subject/feknvttx.html