美文网首页
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-函数调用方式 严格模式 作用域 变量/函数提升

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