作用域

Posted qingtiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域相关的知识,希望对你有一定的参考价值。

概念:

  • 提供代码的执行环境;
  • 对于代码执行要有作用域的概念;
  • 开辟一个栈内存;只有关闭浏览器这个栈内存才会销毁;

1、全局作用域:

  • 一打开浏览器,浏览器就会形成一个全局作用域;
  • 在控制台写代码就相当于在全局作用域里写代码 ;
  • 在全局作用域声明的变量我们称之为全局变量;

2、私有作用域

(1)私有变量

在私有作用域中只有两种情况是私有变量

  • 被声明过的变量(带var/function)
  • 形参也是私有变量

(2)函数执行

  • 声明函数的时候,开辟一个堆内存;把函数中的代码当作字符串存到堆内存里
  • 函数执行:把函数体中的字符串当代码执行;
  • 在变量提升之前还会有一个形参赋值的动作;
  • 变量提升之后再去执行代码;

3、两个作用域之间的关系

  • 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量;
  • 如果两个不同的函数体各自声明了同一个变量,那么该变量只在各自的函数体内起作用。换句话说,不同函数内部的同名变量互相独立,互不影响;由于javascript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行:

4、块级作用域

  • 一般用大括号{}包含的部分会形成一个块级作用域;用let/const基于ES6语法规范渲染的;(对象的大括号不是块级作用域) 不会对上级作用域产生影响;
  • 循环体也是块级作用域,初始值设置的变量是当前本次块级作用域中的变量

5、作用域销毁

  • 立即销毁:函数执行完成之后返回的内容(引用数据类型)没被占用;值类型直接销毁;
  • 不立即销毁:返回的内容(引用数据类型)暂时被占用
  • 不销毁:返回的内容(引用数据类型)被占用
  function f1() {
    return function() {
      console.log(1);
    };
  }
  f1(); //f1作用域 立即销毁
  f1()(); //f1作用域 不立即销毁
  var f2 = f1(); //f1作用域 不销毁

 

以上是关于作用域的主要内容,如果未能解决你的问题,请参考以下文章

JS 作用域及作用域链

作用域是什么?

JavaScript 作用域 与 作用域链

JS---闭包

angularjs作用域之transclude

Python - 模块