5-函数调用方式 严格模式 作用域 变量/函数提升

函数的调用方式

  • 普通的函数调用方式直接调用(this丢失问题): window(非严格) | undefined(严格)
  • new构造函数调用方式, 构造函数内部新创建的对象
  • 作为一个对象的方法调用, 指向当前的对象
  • call | apply(函数上下文), 指向第一参数

严格模式

  1. 定义: 在此模式下, 会做更加严格的语法检查
    • 以前在非严格模式下可以使用的一些语句, 在严格模式下直接报错或者抛出异常
  2. 开启严格模式: "use strict";
    • 书写注意
      • 分号可省略
      • 单引号/双引号都可以
      • 区分大小写, 都是小写
      • 必须是10个字符, 需要把字符串写在script标签顶部
  3. 兼容: 如果浏览器支持严格模式就会开启严格模式,如果不支持,'use strict'作为一段字符串忽略处理
  4. 严格模式作用域
    • script的顶部, 对整个script标签内有效
    • 写在函数的顶部, 只对当前这个函数有效

严格模式注意点

  1. 必须使用Var关键字声明变量
  2. 使用delete关键字删除全局变量会直接报错
  3. 对象中不能存在同名的属性
    • 编译器错误
  4. 函数的形参必须唯一(不能出现同名的参数)
    • 编译器错误
  5. 禁止使用with语句
  6. 不能使用eval和arguments作为标识符
  7. 修正函数内部this的指向
    • 在严格模式下, this始终指向指定的值(未指定的话, 就指向undefined)
    • obj.showName.call(null); //指向null
  8. 禁止使用8进制
  9. 在if语句中不能申明函数
  10. 不能使用callee/caller, 一个指向函数自身/返回调用函数的函数
    • 在全局作用域中, caller返回null
  11. 在严格模式下, arguments的使用区别
    • 在非严格模式下, arguments和形参共享同一份数据
    • 在严格模式下, arguments和形参是独立的

作用域: 一个变量的作用范围

  1. 块级作用域: 在JS中没有块级作用域
  2. JS中的作用域
    • script标签组成的全局作用域
    • JS中函数是唯一可以创建作用域的对象
  3. 词法作用域: 一个变量声明完后作用域就已经确定了
    • JS属于词法作用域
  4. 动态作用域: 变量的作用域由程序执行环境决定
  5. 词法作用域中变量的访问原则
    • 首先在当前作用域中查找, 如果没有就去上一级作用域中查找, 直到访问到全局作用域
    • 内层作用域可以访问外层作用域

变量和函数的提升

  • JS代码的执行过程
    1. 预解析: 在预解析阶段,系统会对var声明的变量和function声明的代码块进行一个声明提升,提升到当前作用域的顶端
    2. 执行代码
  • 注意点
    • 变量与变量同名, 后面会覆盖前面的
    • 函数与函数同名, 后面会覆盖前面的(函数没有重载)
    • 变量和函数同名, 可以理解为只提升函数声明, 不提升变量(和函数同名的)

变量的提升是分作用域的

  • 变量的提升: 提升到当前作用域的顶端

  • 函数表达式的提升: 只会提升var声明的变量,并不会把整一个函数表达式进行提升

          var fun1 = function () {
              console.log('f1');
          }
          var a = 20;
          console.log(a);     //20
          fun1();     //f1
    
          //模拟变量提升
          var fun1;
          var a;
          fun1 = function () {
              console.log('f1');
          }
          a = 20;
          console.log(a);     //20
          fun1();     //f1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。