5-函数调用方式 严格模式 作用域 变量/函数提升
2017-12-01 本文已影响0人
前端雨
函数的调用方式
- 普通的函数调用方式直接调用(this丢失问题): window(非严格) | undefined(严格)
- new构造函数调用方式, 构造函数内部新创建的对象
- 作为一个对象的方法调用, 指向当前的对象
- call | apply(函数上下文), 指向第一参数
严格模式
- 定义: 在此模式下, 会做更加严格的语法检查
- 以前在非严格模式下可以使用的一些语句, 在严格模式下直接报错或者抛出异常
- 开启严格模式:
"use strict";
- 书写注意
- 分号可省略
- 单引号/双引号都可以
- 区分大小写, 都是小写
- 必须是10个字符, 需要把字符串写在
script
标签顶部
- 书写注意
- 兼容: 如果浏览器支持严格模式就会开启严格模式,如果不支持,
'use strict'
作为一段字符串忽略处理 - 严格模式作用域
- 在
script
的顶部, 对整个script
标签内有效 - 写在函数的顶部, 只对当前这个函数有效
- 在
严格模式注意点
- 必须使用Var关键字声明变量
- 使用delete关键字删除全局变量会直接报错
- 对象中不能存在同名的属性
- 编译器错误
- 函数的形参必须唯一(不能出现同名的参数)
- 编译器错误
- 禁止使用with语句
- 不能使用eval和arguments作为标识符
- 修正函数内部this的指向
- 在严格模式下, this始终指向指定的值(未指定的话, 就指向undefined)
obj.showName.call(null); //指向null
- 禁止使用8进制
- 在if语句中不能申明函数
- 不能使用callee/caller, 一个指向函数自身/返回调用函数的函数
- 在全局作用域中, caller返回null
- 在严格模式下, arguments的使用区别
- 在非严格模式下, arguments和形参共享同一份数据
- 在严格模式下, arguments和形参是独立的
作用域: 一个变量的作用范围
- 块级作用域: 在JS中没有块级作用域
- JS中的作用域
-
script
标签组成的全局作用域 - JS中函数是唯一可以创建作用域的对象
-
- 词法作用域: 一个变量声明完后作用域就已经确定了
- JS属于词法作用域
- 动态作用域: 变量的作用域由程序执行环境决定
- 词法作用域中变量的访问原则
- 首先在当前作用域中查找, 如果没有就去上一级作用域中查找, 直到访问到全局作用域
- 内层作用域可以访问外层作用域
变量和函数的提升
- JS代码的执行过程
- 预解析: 在预解析阶段,系统会对var声明的变量和function声明的代码块进行一个声明提升,提升到当前作用域的顶端
- 执行代码
- 注意点
- 变量与变量同名, 后面会覆盖前面的
- 函数与函数同名, 后面会覆盖前面的(函数没有重载)
- 变量和函数同名, 可以理解为只提升函数声明, 不提升变量(和函数同名的)
变量的提升是分作用域的
-
变量的提升: 提升到当前作用域的顶端
-
函数表达式的提升: 只会提升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