美文网首页
js 变量的作用域和变量提升

js 变量的作用域和变量提升

作者: jojoYaa | 来源:发表于2018-06-23 16:30 被阅读0次

变量的作用域

  1. 变量分为两类:全局(global)的和局部的,全局变量的作用域是全局性的,局部变量写在函数体内,变量申明时不加var则会变成全局变量
  2. 函数体内部可以读取到函数外的变量,而函数外不能读取到函数内的变量
var num="100";
function scope(){
    var num="10";
    function innerScope(){
        var num = "1";
        console.log(scope);//输出:1 找到innerScope里的num
    }
    innerScope();
    console.log(num);//输出:10 找到sope里的num
}
scope();
console.log(num);//输出:100
  1. ES6中新增了块级作用域,let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
for(var i = 1; i < 5; i++){
  console.log(i);//1 2 3 4
}
console.log(i);//5
// 通常是因为只想在for循环内部的上下文中使用变量i,但实际上i可以在全局作用域中访问

for(let j = 1; j < 5; j++){
   console.log(j);//1 2 3 4
}
console.log(j);//ReferenceError: j is not defined
// 由于let创建的是块级作用域,所以外部无法访问到let声明的变量

变量提升

  • 在Javascript中,函数及变量的声明都将被提升到函数的最顶部。
  • 提升的仅仅是变量的声明,变量的赋值并不会被提升,但函数的声明与变量的声明是不一样的,函数的函数体也会被一起提升
var a = 100;
function test(){
    console.log(a);
    a = 10;
    console.log(a);
    console.log(this.a);
    var a;
}
test();
  1. 因为变量提升,a提升到最前面,声明未赋值,所以第一个就会打印undefined;
  2. 第二个在a声明之后,而且a赋值为10,所以第二个打印出来10;
  3. 第三个,因为test()是在window下调用的;this指的是test()调用的作用域,所以第三个打印100;
alert(a)
a();
var a=3;
function a(){
  alert(10)
}
alert(a)
a=6;
a()
  1. 函数声明优先于变量声明,所以,刚开始,a就是function a(){alert(10)}
  2. a(),执行函数,出现alert(10)
  3. 执行了var a=3; 所以alert(a)就是显示3
  4. 由于a不是一个函数了,所以往下在执行到a()的时候, 报错Uncaught TypeError: a is not a function。

let会不会变量提升呢?https://zhuanlan.zhihu.com/p/28140450

相关文章

  • 作用域与变量提升

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

  • JS 提升

    变量提升即将变量声明提升到它所在作用域的最开始的部分 在 js 中只有两种作用域,全局作用域和函数作用域,在ES6...

  • js 的变量提升和函数提升

    1. 深入理解 js 的变量提升和函数提升 先了解:js没有块级作用域,只有全局作用域,和函数作用域 相同的函数名...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • var let const之间的区别?

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

  • js 变量的作用域和变量提升

    变量的作用域 变量分为两类:全局(global)的和局部的,全局变量的作用域是全局性的,局部变量写在函数体内,变量...

  • JS 闭包(Closure)

    参考阮一峰老师的JS 闭包 理解闭包前需要理解变量作用域、变量提升 JS作用域 那如何让它依次打印,12345呢;...

  • 2018-08-03

    js作用域和作用域链 什么是作用域 ⼀个变量的作⽤域是程序源代码中定义这个变量的区域。对象, 函数也是变量。作...

  • 老司机也翻车的闭包

    前置知识 es6之前,js中变量作用域分为两种:全局作用域、局部作用域。学习闭包之前需要先了解作用域及变量提升的概...

  • js中作用域与作用域链

    js中作用域与作用域链 作用域 *作用域基本概念 作用域一般指变量的作用范围,变量分为全局变量和局部变量,对应的作...

网友评论

      本文标题:js 变量的作用域和变量提升

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