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 代码的时候,分为两个过程:预解析过程和代码执行过程。
- 预解析过程
- 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
- 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
- 先提升 var,再提升 function
- 变量声明提升
- 在预解析过程中,所有定义的变量,都会将声明的过程提升到所在的作用域最上面,在将来的代码执行过程中,按照先后顺序会先执行被提升的声明变量过程
- 提升过程中,只提升声明过程,不提升变量赋值,相当于变量定义未赋值,变量内存储undefined 值因此在 js 中会出现一种现象,在前面调用后定义的变量不会报错,只会使用undefined 值
- 函数声明提升
-
在预解析过程中,所有定义的函数,都会将声明的过程提升到所在的作用域最上面,在将来的代码执行过程中,按照先后顺序会先执行被提升的函数声明过程。
-
在预解析之后的代码执行过程中,函数定义过程已经在最开始就会执行,一旦函数定义成功,后续就可以直接调用函数
因此,在 js 中会出现一种现象,在前面调用后定义的函数,不会报错,而且能正常执行函数内部的代码
-
IIFE立即执行函数
IIFE真的只是为了立即执行吗?当然不是 ,实际上它的出现是为了解决几个常见的JS问题;
- 变量污染:在JS中,如果你不在函数内部声明变量,那这个变量就会成为全局变量。这可能会导致意外的全局变量污染,当引入多个js文件或库同时运行时。IIFE通过创建一个新的作用域来避免这个问题,所有的变量和函数都定义在这个新的作用域内,不会影响到全局作用域。
- 命名空间隔离:在大型项目中,可能有很多不同的库或脚本文件同时运行。这些库或脚本文件可能会定义相同名称的函数或变量,导致命名冲突。IIFE为每个库或脚本文件提供了一个独立的命名空间,防止了这种冲突。
- 代码重用:由于IIFE创建了一个新的作用域,你可以在其中定义一些私有变量和函数,这些私有变量和函数可以被这个作用域内的其他代码重用,但不会被外部代码访问。这有助于提高代码的可重用性和可维护性。
- 配置和初始化:IIFE也可以用于配置和初始化代码。你可以将配置对象作为参数传递给IIFE,然后在IIFE内部使用这个配置对象来设置或初始化一些变量和函数。这种模式使得代码更加灵活和可配置。
(function() {
// 这里是IIFE的作用域,你可以在这里定义变量和函数
var privateVar = "Hello, World!";
function privateFunction() {
console.log(privateVar);
}
// 这个函数会在IIFE被调用时执行
function init() {
privateFunction();
}
// 调用init函数,这会导致privateFunction被执行
init();
})();
在这个示例中,privateVar和privateFunction都是IIFE内部的私有变量和函数,它们不会被外部代码访问。同时,init函数在IIFE被调用时执行,这会导致privateFunction被执行,打印出"Hello, World!"。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://mi-blog.cn/index.php/2020/01/16/js%e5%87%bd%e6%95%b0/