美文网首页
5-函数调用方式 严格模式 作用域 变量/函数提升

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

作者: 前端雨 | 来源:发表于2017-12-01 20:45 被阅读0次

函数的调用方式

  • 普通的函数调用方式直接调用(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

相关文章

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

    函数的调用方式 普通的函数调用方式直接调用(this丢失问题): window(非严格) | undefined...

  • JavaScript严格模式说明及变量函数的提升day05

    JavaScript严格模式说明及变量函数的提升 一.严格模式的简单说明 1.函数调用的方式和this的丢失 (1...

  • 函数this调用

    函数一共有6种调用方式 严格模式下this的指向问题 1.以前在全局作用域函数中的this指向window;严格模...

  • let const var

    变量提升 函数会优先于变量提升; 函数提升会把整个函数移到作用域顶部 变量提升智慧把变量的定义移到作用域顶部 wi...

  • 2019-11-11-本周学习周报

    学习总览 JavaScript 函数作用域、块级作用域 变量提升、函数提升 CSS 新增属性transition ...

  • python局部作用域和全局作用域

    在被调用函数内部赋值的变量,处于该函数的局部作用域,函数之外的变量,属于全局作用域。函数内部的变量就是局部变量,函...

  • JavaScript 函数

    函数函数定义与调用变量作用域全局变量方法高阶函数闭包箭头函数$generator$ 函数 函数定义与调用 定义函数...

  • es6

    let const var 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用...

  • js 基础

    JavaScript 函数 是对象 函数提升 提升作用域 在声明前调用。 自调用 (不能自调用声明的函数) 表达...

  • 重学 JavaScript 笔记(二)—— 原型 && 继承

    3.1 函数 3.1.1 函数声明: 3.1.2 函数调用 3.1.3 变量作用域 函数内声明的变量,只在该函数内...

网友评论

      本文标题:5-函数调用方式 严格模式 作用域 变量/函数提升

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