作用域与变量提升

作者: HM4041812 | 来源:发表于2017-11-18 22:07 被阅读4次

作用域与变量提升


作用域

JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围。

  • 全局作用域:
    1.最外层函数和最外层函数外面定义的变量。
    2.未声明直接赋值的变量,自动声明为全局变量。
    3.window对象的内置对象,如window.name,window.location。
  • 局部作用域:
    一般会出现在函数内部,只有固定的代码段才可以访问。

局部作用域变量优先于全局变量,函数只是一个作用域的基本单位。

例1:

var name = "one";
function test() {
    name = "two"
}
test();
console.log(name)    //输出为 two

解析
  函数内部省略var,会影响全局变量,name被重置为全局变量。js中,函数是一个作用域的基本单位,函数内声明的所有变量在函数体内始终是可见的。

例2:

   function test() {
       var name = "one" ;
           return function () {
              console.log(name)
           }
   }
test()();

test()之后将调用外层函数test返回内层函数function,再继续(),相应调用执行了内层函数function(),输出name。

变量提升

声明提前是在js预编译是就进行了,变量提升知识提升变量的声明,并不会吧值也提上来。

例1:

var name = "one" ;
function () {
   console.log(name)   //one
   name = "two" ;
   console,log (name)  //two
}
test();
var name = "one" ;
function () {
   console.log(name) ;    //undefine
   var name = "two" ;
   console.log(name)      //two
}
test()

解析:
局部优先于全局,预编译(变量提升),所以函数内的name为局部变量,所以第一个位undefine。

内部不影响外部

function test(name) {
   console.log(name)    //name
   name = "two"
   console.log(name)    //two
}
var name = "one"
test(name)
console.log(name)      //one

解析:
  传进test的,实际上是一个副本,函数返回后这个副本就被清除了,并非实际的name。

相关文章

  • 作用域与变量提升

    作用域与变量提升 作用域 JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围...

  • 《javascript基础补充--作用域与作用域链相关知识点》

    关键词:全局变量、局部变量、变量提升机制、内存回收机制、作用域、作用域链 变量(作用域) 局部变量可以与全局变量重...

  • 全面理解作用域

    es5:函数作用域、全局作用域 (var 、function有变量提升)es6:块级作用域 (没有变量提升...

  • let const var

    变量提升 函数会优先于变量提升; 函数提升会把整个函数移到作用域顶部 变量提升智慧把变量的定义移到作用域顶部 wi...

  • 变量函数提升与执行上下文

    变量与函数提升 作用域与执行上下文的区别 执行上下文 执行上下文栈 作用域 作用域链

  • var,let,const 的区别

    变量提升 变量提升即将变量声明提升到它所在作用域最前面,而且仅仅是提升变量,不会提升所赋的值 执行流程 作用域 在...

  • var 与 ES6中的 let、const

    首先你要清楚 JavaScript的作用域 变量的提升 常量与变量 一)变量提升 由上图中可知:let与const...

  • var let const之间的区别?

    1.var ①var声明的变量没有块级作用域,只有函数作用域和全局作用域 ②var声明的变量有变量提升 ③变量可以...

  • 第三章 函数

    变量作用域   以上例子中函数作用域会覆盖始终优先于全局作用域,所以局部变量a会覆盖掉全局作用域的a,变量提升不会...

  • 块作用域和let、const

    在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。 变量提升即将变量声明提升到它所在作...

网友评论

    本文标题:作用域与变量提升

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