JS函数
函数
- 接触的第一个封装代码的方法,使代码更具有复用性
函数重载
- 此概念来自C语言:C的函数可以定义不同的参数属性,执行不同的逻辑代码,JS本身不具备词语法,但是可以曲线解决
- 函数的
arguments属性: 此属性是函数默认具有的属性,其中保存了传入参数的类数组类似数组,但直接继承的是Object - 在JS中传入的参数会保存在
arguments变量中, 这个变量是每一个函数对象自带的变量, 只要在函数中都可以访问
全局污染
- 所有var 声明的变量其实就是存储在window对象添加是个属性
- v8 nodejs下变量存储在: 基础类型在栈内存,对象存在堆内存
- 浏览器下的js变量全部存储在: window对象中
- 浏览器下的js全部都是在操作window对象,window对象保存了操作页面的各种方法
- 浏览器兼容性,其实是windows对象中的内容有所不同。导致浏览器的兼容问题
- 浏览器脚本范围内书写的代码可以省略window前缀, 一般都进行省略,因为他默认去调window对象下的方法
var a = 0; === window.a = 0;
- 如果变量的名字,在window对象下有的属性或方法名,此时会造成全局污染我定义的会替换window对象下的重名的方法。也就是把系统自带的属性或方法修改了
声明提升
当js在浏览器中运行时,我们书写的各种方法:prompt..存在哪里
我们var的变量存在哪里?
基础类型 number string boolean null undefined
新增类型 bigint(未普及) symbol(不可变数据类型)
-
变量提升提升特指var,声明提升:所有声明方式都有提升-- var函数 let const 都有提升
-
提升都是在 提词器和解析器的预解析阶段进行 提升的
声明变量一共有三步 例如:var a=8;
- var a; 声明阶段 (暂存死区)
- a=undefined; 初始化阶段
- a=8; 赋值阶段
- 在变量声明 上方打印打印的结果为undefined
- 执行到var a=8;时候才算是赋值,打印可以拿到值
let 声明变量
- var a; 声明阶段 (暂存死区)
- a=undefined; 初始化阶段
- a=8; 赋值阶段
- let也有变量提升,但是处于在声明阶段(也叫暂存区)无法在赋值的上方调用。
const 声明常量
- var a; 声明阶段 (暂存死区)
- a=undefined; 初始化阶段
- a=8; 赋值阶段
- const也有变量提升,但是处于在声明阶段(也叫暂存区)无法在赋值的上方调用。
函数会提升 整体提升
- var a; 声明阶段 (暂存死区)
- a=undefined; 初始化阶段
- a=function(){}; 赋值阶段
- 函数的提升会提升整体(函数+函数体);
function a(){
}
函数作用域
- 每个函数都有自己独立的作用域,用于存储自己内部的变量,外部无法访问,但内部函数可以访问
作用域链
作用域中使用某个变量,会逐层向上级作用域查找, 找到距离最近的哪个,
函数外部为全局作用域,函数的大括号内有一个独立的空间,函数内为函数作用域,在函数内部调用变量会优先找自己函数内。如果没有去上一层函数中寻找该变量一值找到window对象
console.dir(func_obj) // scope: 作用域; closure:闭包 ;global:全局
闭包
JS的预编译机制:JS代码执行之前都会把函数搬运到外部区域,为了保证函数能正常执行,所以函数内部使用的变量,也必须同步提取到外部,并且保存到:scopes
闭包: 函数会形成独立的作用域(内部空间),相对于全局来说一块封闭的空间。这个空间叫做闭包
用途:闭包为了 防止全局的变量冲突。。。
缺点:函数用到的外部作用域的变量不会被GC释放, 浪费内存空间。需要手动把函数改为null,才能释放闭包中的变量。
总结: 词法环境 存储的是内部函数要使用的变量,在外部作用域一层一层寻找直到到window对象,如果有就存储到词法环境中。 等待方法调用时直接调用变量

函数声明的区别
var 定义的函数 也是分为三个阶段
var fn2;
fn2=undefined
fn2=function(){}
注意:前两个阶段是在提词器和解释器之间的一个叫:预解析阶段发生的;
第三个阶段fn2 = function(){} 是在代码具体执行到的位置 发生的: var fn2 = function{}
function fn3(){} 这个声明的方式是直接提升的完整的三个阶段; 如果:var fn3 = function{}和function fn3(){}同时存在优先提升 function fn3(){}声明的 预解析阶段时三个阶段都被提升: ```
var fn3;
fn3=undefined
fn3=function(){}

浙公网安备 33010602011771号