JS函数

米阳 2020-1-16 469 1/16

js函数这个概念太大了,这篇浅聊一下对函数的理解和一些注意点。

首先函数就是把一段干某件事的代码包起来,留着复用,哪里用就放哪里,让这个函数干某件事就要有输入(入参)和输出(运行结果),比如:计算两个数字的和  两个数字就是入参,他们的和就是运行结果。

arguments

arguments 代表了函数调用时传递的参数列表,可以获取到传递给函数的实参,它是一个类数组对象,可以通过索引访问其中的参数值。可以使用 arguments.length 属性获取传递的参数个数

function exampleFunc(a, b, c) {
      console.log(arguments[0]); // 访问第一个参数
      console.log(arguments[1]); // 访问第二个参数
      console.log(arguments.length); // 参数个数
}

exampleFunc(1, 2, 3); // 1,2

function func(a, b, ...rest) {
      console.log(a); // 1
      console.log(b); // 2
      console.log(rest[0]); // 3
}

func(1, 2, 3);

遮蔽效应

不同层次的函数内都有可能定义相同名字的变量,一个变量在使用时,会优先从自己所在层作用域查找变量,如果当前层没有变量定义会按照顺序从本层往外依次查找,直到找到第一个变量定义。整个过程中会发生内层变量遮蔽外层变量的效果,叫做“遮蔽效应”。

var a = 1
function outer(){
  var a = 2;
  function inner(){
    var a = 3;
    console.log(a);
  }
  inner();
  console.log(a)
}
outer();  //输出  3  2

预解析

JavaScript 代码的执行是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器执行JavaScript 代码的时候,分为两个过程:预解析过程和代码执行过程。

  • 预解析过程
    1. 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
    2. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
    3. 先提升 var,再提升 function
  • 变量声明提升
    • 在预解析过程中,所有定义的变量,都会将声明的过程提升到所在的作用域最上面,在将来的代码执行过程中,按照先后顺序会先执行被提升的声明变量过程
    • 提升过程中,只提升声明过程,不提升变量赋值,相当于变量定义未赋值,变量内存储undefined 值因此在 js 中会出现一种现象,在前面调用后定义的变量不会报错,只会使用undefined 值
  • 函数声明提升
    • 在预解析过程中,所有定义的函数,都会将声明的过程提升到所在的作用域最上面,在将来的代码执行过程中,按照先后顺序会先执行被提升的函数声明过程。

    • 在预解析之后的代码执行过程中,函数定义过程已经在最开始就会执行,一旦函数定义成功,后续就可以直接调用函数

      因此,在 js 中会出现一种现象,在前面调用后定义的函数,不会报错,而且能正常执行函数内部的代码

IIFE立即执行函数

IIFE真的只是为了立即执行吗?当然不是 ,实际上它的出现是为了解决几个常见的JS问题;

  1. 变量污染:在JS中,如果你不在函数内部声明变量,那这个变量就会成为全局变量。这可能会导致意外的全局变量污染,当引入多个js文件或库同时运行时。IIFE通过创建一个新的作用域来避免这个问题,所有的变量和函数都定义在这个新的作用域内,不会影响到全局作用域。
  2. 命名空间隔离:在大型项目中,可能有很多不同的库或脚本文件同时运行。这些库或脚本文件可能会定义相同名称的函数或变量,导致命名冲突。IIFE为每个库或脚本文件提供了一个独立的命名空间,防止了这种冲突。
  3. 代码重用:由于IIFE创建了一个新的作用域,你可以在其中定义一些私有变量和函数,这些私有变量和函数可以被这个作用域内的其他代码重用,但不会被外部代码访问。这有助于提高代码的可重用性和可维护性。
  4. 配置和初始化:IIFE也可以用于配置和初始化代码。你可以将配置对象作为参数传递给IIFE,然后在IIFE内部使用这个配置对象来设置或初始化一些变量和函数。这种模式使得代码更加灵活和可配置。
(function() {  
  // 这里是IIFE的作用域,你可以在这里定义变量和函数  
  var privateVar = "Hello, World!";  
  
  function privateFunction() {  
    console.log(privateVar);  
  }  
  
  // 这个函数会在IIFE被调用时执行  
  function init() {  
    privateFunction();  
  }  
  
  // 调用init函数,这会导致privateFunction被执行  
  init();  
})();

在这个示例中,privateVarprivateFunction都是IIFE内部的私有变量和函数,它们不会被外部代码访问。同时,init函数在IIFE被调用时执行,这会导致privateFunction被执行,打印出"Hello, World!"。

- THE END -

米阳

6月24日15:37

最后修改:2024年6月24日
0

非特殊说明,本博所有文章均为博主原创。