美文网首页
三、作用域和预解析

三、作用域和预解析

作者: 輪徊傷 | 来源:发表于2021-08-26 20:21 被阅读0次

1、作用域

定义
简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期

  • 全局作用域:用 var 在全局(函数外)声明的所有变量,都具有全局作用域
    可以理解为,在全局作用域声明的变量是全局变量,在任何地方都可以使用
var a = 10  //声明了全局变量

console.log(a) //此处可调用 a 变量

function f(){
  console.log(a) // 函数内可调用 a 变量
}

在函数中没有声明的变量会自动提升到全局作用域,即为全局变量

function f() {
    a = "LB";
    // 此处可调用 a变量
    console.log(a)  //结果为undefined
}
  // 此处可调用 a变量
    console.log(a)  //结果 报错 Uncaught ReferenceError: a is not defined
image.png
  • 函数作用域:在函数中用 var 声明的所有变量,都是函数的局部变量,具有局部作用域,即:变量只能在函数内部使用,函数外部是不行的
function f(){
  var b = 11;
  // 函数内可调用 b 变量
  console.log(b) //结果  11
}
// 函数外调用 b 变量,就会报错
  console.log(b) //结果  11
image.png

闭包

定义: 闭包是指有权访问另一个函数作用域中的变量的函数

function A(){
     var a = 10;   // 垃圾回收机制
      return function(sum){
                      console.log(a)
              a = sum
              console.log(a)
      }
}
     let f= A()
     f(11)
  • 为什么要使用闭包或者什么时候(场景)需要使用:因为作用域的问题,函数外部不能访问函数内部的变量,当我们想访问函数内部的变量的时候,就得用到闭包,闭包的形式是:一个函数里面面返回另一个函数

\color{red}{闭包的优点:} 1.避免全局变量污染; 2.可以设置私有变量
\color{red}{闭包的缺点:}缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露

  • 块级作用域:ECMAScript 6(简称ES6)中新增了块级作用域
    在 ES6 之前,是没有块级作用域的概念,ES6 新增 let 关键字或者 const 关键字来实现块级作用域
    重点:let 或 const声明的变量只在 let 或 const命令所在的代码块 {} 内有效,在 {} 之外不能访问
{ 
    let name = "LBipanda";
    // 这里访问到 name 为 LBipanda
}
//  在外面访问不到 name变量
{
//  在另个代码块也访问不到 name变量
}

2、预解析 : 通过var 声明的变量 和function 声明的变量,在程序开始执行之前会提升上代码最顶部,先提生var 声明的变量,再提升function声明的函数整体
例一、

        a()
        var a  = function(){
            console.log(11)
        }
        a()
        function a(){
            console.log(10)
        }
        a()
        a = function(){
            console.log(12)
        }
        a()

例二、

function Foo() {
    getName = function(){ alert(1); };
    return this; 
}

 Foo.getName = function() { alert(2); };
 Foo.prototype.getName = function(){ alert(3); };
 var getName = function() { alert(4); };
function getName(){ alert(5); }

Foo.getName();
 getName(); 
 Foo().getName(); 
getName();  
 new Foo.getName(); 
new Foo().getName(); 
 new new Foo().getName();
例一、结果 //10  11  11  12
例二、结果 //2  4  1  1  2  3

相关文章

  • 三、作用域和预解析

    1、作用域 定义简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期 全局作用域...

  • JS基础:作用域

    一、作用域概念-预解析规则、表达式 作用域: 域:空间,范围,区域……作用:读,写 浏览器——JS解析器: 在浏览...

  • JS作用域

    一、js作用域概念---预解析规则,表达式 域:指的是一个空间、范围、区域 作用:通常指读和写 所以 作用域:指的...

  • JavaScript(1)预解析

    预解析只会发生在通过var定义的变量和function上。 一、原理 1. 定义:预解析:在当前作用域下,js运行...

  • 作用域、作用域链

    作用域 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。 作用域下浏览器的操作 预解析(找v...

  • JavaScript作用域和预解析

    作用域链 默认情况下全局作用域, 我们称之为0级作用域 只要定义一个函数就会再开启一个作用域 如果该函数是在全局作...

  • JavaScript作用域和预解析

    作用域 JavaScript中也有作用域的概念 相同作用域内不能有同名的变量和函数, 不同作用域内可以有同名的变量...

  • 匿名函数 闭包 JavaScript线程

    预解析 所谓预解析,就是在当前作用域之下,在js代码运行之前,会把带有var和function关键字的事先声明,但...

  • JS高级-闭包、沙箱

    作用域,作用域链,预解析 变量:局部变量、全局变量 作用域:变量的使用范围 js中没有块级作用域,一对括号中定义的...

  • js小知识点(预解析 引用 异常 严格模式)

    预解析:会预先解析一些(变量定义、函数会预解析);var a=12;只把var a提到作用域的顶部js会把变量的声...

网友评论

      本文标题:三、作用域和预解析

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