Loading

JS函数

函数

  • 接触的第一个封装代码的方法,使代码更具有复用性

函数重载

  • 此概念来自C语言:C的函数可以定义不同的参数属性,执行不同的逻辑代码,JS本身不具备词语法,但是可以曲线解决
  • 函数的arguments属性: 此属性是函数默认具有的属性,其中保存了传入参数的类数组类似数组,但直接继承的是Object
  • 在JS中传入的参数会保存在arguments变量中, 这个变量是每一个函数对象自带的变量, 只要在函数中都可以访问

全局污染

  • 所有var 声明的变量其实就是存储在window对象添加是个属性
  1. v8 nodejs下变量存储在: 基础类型在栈内存,对象存在堆内存
  2. 浏览器下的js变量全部存储在: window对象中
  3. 浏览器下的js全部都是在操作window对象,window对象保存了操作页面的各种方法
  4. 浏览器兼容性,其实是windows对象中的内容有所不同。导致浏览器的兼容问题
  5. 浏览器脚本范围内书写的代码可以省略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;

  1. var a; 声明阶段 (暂存死区)
  2. a=undefined; 初始化阶段
  3. a=8; 赋值阶段
  • 在变量声明 上方打印打印的结果为undefined
  • 执行到var a=8;时候才算是赋值,打印可以拿到值

let 声明变量

  1. var a; 声明阶段 (暂存死区)
  2. a=undefined; 初始化阶段
  3. a=8; 赋值阶段
  • let也有变量提升,但是处于在声明阶段(也叫暂存区)无法在赋值的上方调用。

const 声明常量

  1. var a; 声明阶段 (暂存死区)
  2. a=undefined; 初始化阶段
  3. a=8; 赋值阶段
  • const也有变量提升,但是处于在声明阶段(也叫暂存区)无法在赋值的上方调用。

函数会提升 整体提升

  1. var a; 声明阶段 (暂存死区)
  2. a=undefined; 初始化阶段
  3. 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(){}

posted @ 2021-10-29 22:32  guxuanyan  阅读(73)  评论(0)    收藏  举报