l: !1, // 布尔值,初试为false,用来表示当前模块是否被加载
exports: {} // 空对象,用于讲模块导出,存储
};
// 执行函数里面的代码
return e[t].call(a.exports, a, a.exports, n),
a.l = !0,
a.exports
}
n.m = e // n.m 用来存所有的模块
n(2) // 执行当前选中的模块,下标2就是第三个模块
}([
function () {…},
function () {…},
function () {…},
function () {…},
])
### (3)模块化
比如下面代码中有三个模块,他们其实就是三个函数,假设这三个模块都有着不同的功能,这里演示代码中显示的是打印不同字符。
function ModuleA() {console.log(“a”)}
function ModuleB() {console.log(“b”)}
function ModuleC() {console.log(“c”)}
但如果你的写的功能模块有几百上千个,那么这样的书写方式必须放在同一个JS文件中就会非常臃肿,于是出现了这样的代码结构:
!function(i) {
function n(t) {
return i[t].call(a, b, c, d)
}
}([
function(t, e, n) {},
function(t, e, r) {},
function(t, e, o) {},
function(t, e) {},
]);
由于在扣JS加密代码时会经常遇到,所以理解这种语法对于逆向来说是非常重要的。
这种代码组织相当于进行了模块化编程,因此被称为 webpack。上面的代码看起来很费劲,其中的一个重要原因就是函数的参数和函数名都是简单的字母没有含义,都不知道这是干什么。于是我们可以写成下面这种方式便于理解:
!function (allModule) {
// 定义执行模块的函数
function useModule(whichModule) {
// 用call方法来执行函数
allModule[whichModule].call(null, "hello world!");
}
useModule(0) // 这里指定加载哪一个模块
}([
function ModuleA(param) {console.log(“A” + param)}, // 用数组装所有的模块,这是第一个
function ModuleB(param) {console.log(“B” + param)},
function ModuleC(param) {console.log(“C” + param)},
]);
## 二、技术拆解
### (1)JS的自执行函数
IIFE 全称 Immediately-invoked Function Expressions,译为立即调用函数表达式,也称为自执行函数、立即执行函数、自执行匿名函数等,IIFE 是一种语法,这种模式本质上就是函数表达式(命名的或者匿名的)在创建后立即执行。当函数变成立即执行的函数表达式时,表达式中的变量不能从外部访问。IIFE 主要用来隔离作用域,避免污染。它长这个样子(我只介绍最常见的形式):
// 第一种形式:用感叹号表示
!function () {
console.log(“I AM IIFE”)
};
!function () {
console.log(A)
}(A); // 后面紧跟的小括号里面可以传入参数
// 第二种形式:用括号表示
(function () {
console.log(“I AM IIFE”)
}());
(() => {
console.log(“I AM IIFE”)
})();
### (2)call方法apply方法
JavaScript 中的 call() 和 apply() 方法都是函数对象(Function.prototype)上的方法,它们的主要功能是改变函数调用时的上下文环境(即函数内部 this 的指向),同时允许你传递参数给该函数。
下面是call方法的使用例子:
function sayHello(name) {
console.log('Hello, ’ + this.name + ', ’ + name);
}
let user = { name: ‘John’ };
sayHello.call(user, ‘Doe’); // 输出 “Hello, John, Doe”
下面是apply方法的使用例子:
function sum(a, b) {
return a + b;
}
let numbers = [3, 5];
let result = sum.apply(null, numbers); // 输出 8,等同于 sum(3, 5)
总结起来就是,call和apply第一个参数都是函数运行时的上下文对象thisArg。后面的参数不同,对于call来说,参数是一个个传入;对于apply来说,参数是通过一个数组传入。
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/9e75e6091846b019ec55a98b5a92b0f7.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/6b78223ff566ab938cd1f6d3f4c968f6.png)
![img](https://img-blog.csdnimg.cn/img_convert/acf6d25a871fdd813a6d3268684d42ac.png)
![img](https://img-blog.csdnimg.cn/img_convert/8c3f0f035394b08b17d52134c5d264dd.png)
![img](https://img-blog.csdnimg.cn/img_convert/43532f9c80dcbedb972b8beb6e7ca456.png)
![img](https://img-blog.csdnimg.cn/img_convert/298b4c241159446f358ff891e7d12114.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)**
![img](https://img-blog.csdnimg.cn/img_convert/dfd17d259a87f8c4d6809961c41889b7.png)
#### 结束
一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!
![](https://img-blog.csdnimg.cn/img_convert/45f2869b91b538dd3bb3290ba13bc806.png)
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/65ee4b94427e9b2f9aab39c866a7218f.png)
13bc806.png)
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-aJp1V6k6-1712879266088)]