zoukankan      html  css  js  c++  java
  • JavaScript 的 作用域----个人理解

    作用域,变量的作用范围
    在ES6之前
    变量的声明
      只有var可以声明变量属于某个作用域,并且,也只有全局作用域和函数作用域。(没有var声明的变量,属于全局作用域,在全局作用域里声明的变量,函数会成为全局的属性)
      所有的变量,不是全局作用域的,就是函数作用域的。
      如果用var 声明变量,并且是在函数中,那么这个变量就属于这个函数,否则,属于全局变量。
     
    提升
      在JavaScript的任何一个作用域中,都存在提升;
            对于一个声明var  a=2;引擎主要会分两步走,var a;   a=2;  JS引擎进行处理和执行。
           所谓的处理,引擎首先会进行全局的扫描,遇到变量的声明(var 声明的变量)就会记录,遇到函数声明(function 关键字开头)也会进行记录,直到全局扫描完毕。然后,引擎开始从头执行,对变量进行修改,对函数进行调用。
          上边所谓的记录,就是提升行为。(如果学过C语言,就知道,函数,变量都要先定义,在使用,否则会报错,但是,js提升,可以理解为,不管你定义在哪里,都会被提升到使用的前面,也就是可以把使用写在定义前面)
          引擎会把声明的变量,函数声明记录到全局的作用域,记录有哪些变量存在,并对变量进行初始化赋值,undefined;为什么是记录到全局,而不是对应作用域,主要是因为,一开始扫描,就是扫描全局作用域,它只扫描一级, 它不会深入扫描,只扫描表面。这个其实很好理解,除了变量的提升,还有函数声明的提升,遇到function 关键字,js引擎只是简单的将其提升到最顶层,在全局作用域中定义的函数,它作用域就相当于二级,js引擎是不会在这个时候去扫描函数作用域的。
      例如:
    var a=1;//全局
    a1=11;//全局
    function one(){
    	var b=2;
    	b1=22;//全局
    }
    
    //打开浏览器
    a:1
    b:Uncaught ReferenceError: b is not defined //因为b是局部变量
    a1:11
    b1:Uncaught ReferenceError: b1 is not defined //很容易可以看出one函数没有被扫描
    one();//调用one函数
    
    a:1
    b:Uncaught ReferenceError: b is not defined //因为b是局部变量
    a1:11   
    b1:22
    window.a:1
    window.a1:11
    window.b1:22
    window.b:undefined
    

      对于函数作用域内部的提升,发生在函数被调用的之后,执行之前,同样会进行表面的扫描,记录附属于这个作用域的变量,函数。 

         如果在一个作用域中遇到变量和函数名相同,那么,函数的优先级高,这个标识符任然是函数名。

     
    ES6 
       对变量的声明多了:var ,let ,const;
       对于var的,没有变化,同ES6之前。 
       let声明变量const声明常量,对于这两个,他们有的是块级作用域,只要是 { ...  },围成的区域,就是块级作用域。
      在块级作用域里,let,const声明的,都是对内可见,对外不可见。并且,都会附着在这个作用域上。并且,let 和const 不存在提升。
      let 和const 不可重复声明同一个标识符。(具体的相关内容参见ES6相关书籍)。
     
    在看了几本书之后的一些理解和自己的想法。以上的主要是参考你所不知道的JavaScript上。
    欢迎各位前辈指正,谢谢。
     
     
     
  • 相关阅读:
    Java Web 开发必须掌握的三个技术:Token、Cookie、Session
    $.proxy和$.extend
    手机端和网页端使用同一后台时进行会话控制
    js中使用EL表达式总结
    Durandal入门
    RequireJs入门
    阿里云Prismplayer-Web播放器的使用
    Mac系统实现git命令自动补全
    Mac系统的终端显示git当前分支
    Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
  • 原文地址:https://www.cnblogs.com/senhaishusheng/p/7183393.html
Copyright © 2011-2022 走看看