一.闭包
广义上有一定作用域的代码块就可以称之闭包。目前我学习的相较狭义,闭包是指函数可以访问和操作函数外部的变量,即使在函数外部调用该函数时,仍然可以使用外部变量。在JavaScript中,闭包是一种特殊的函数对象,它包含了函数本身和在函数定义时创建的作用域。
我的理解就是把一个函数表面再嵌套了一层函数,这一层函数再去定义一些变量之类的。以此达到与外部的隔离,防止外部的一些量影响到函数内部,这个影响也是相对。
优点在于:保护数据,模块化处理。
缺点在于:可能会导致内存泄漏。
内存泄漏的意思是有些没有使用的变量之类的,任然占据内存,导致比较卡之类的。
解决方案:方案一:将未使用的量定义为null即空,空了就不会占据内存。
方案二:直接不使用闭包。
function fn() {
var a = 10;
function fm() {
console.log(a);
}
return fm;
}
var closure = fn(); // 返回内部函数
closure(); // 输出 10
这个就是闭包的大体结构
function counter() {
var count = 0;
function increment() {
count++;
console.log(count);
}
return increment;
}
var counter1 = counter(); // 创建第一个计数器
counter1(); // 输出 1
counter1(); // 输出 2
counter1(); // 输出 3
var counter2 = counter(); // 创建第二个计数器
counter2(); // 输出 1
这里就是体现了保护数据与外部相隔的特点。
总之闭包的作用大概就是
避免全局污染: 闭包可以有效地避免全局变量的污染。通过将变量和函数封装在闭包中,可以限制其作用域仅在闭包内部,而不会影响全局作用域。这样可以减少命名冲突和代码的不可预测性。
二.回调函数
在 JavaScript 中,回调函数是一种广泛使用的编程模式,它允许我们在异步操作完成后执行相应的代码。回调函数可以作为参数传递给其他函数,并在适当的时候被调用。
简单来讲就是调用函数时使用函数作为实参传入,先执行想调用的函数,(大多情况下)再将所执行的结果传到当前函数再执行该函数。所以回调函数也称之为"钩子函数".
// 定义一个函数,接受一个回调函数作为参数
function tool(cb){
var a="数据"
cb(a) // 调用回调函数
}
// 定义一个回调函数
function print(arg){
console.log(arg)
}
// 调用 tool 函数,并将 print 函数作为回调函数传入
tool(print);//输出"数据"
目前还比较基础,可能会有后续补充。
三.函数的自调用
这个见名知意,函数的自调用见名知意也就是函数自己调用自己,就像对自己循环一样,注意设置结束。
(function() {
// 在这里编写代码
console.log("这是一个自调用函数");
})();
像这样的函数也称之为匿名函数,并在函数定义后使用一对小括号 () 将其包裹起来。通过在这对小括号后面再加上另一对小括号 (),就触发了立即执行函数。
function count(num) {
if (num === 0) {
console.log("完了");
} else {
console.log(num);
count(num - 1);
}
}
count(5);//输出5、4、3、2、1 并在最后完了
function fn(n){
if(n<1){return 1}
else{return n+fn(n-1)}
}
var re=fn(5);
console.log(re)//输出16
使用自调用函数可以好的表达递归的思想,以上的例子就是一些递归的例子。不过请注意,在使用递归时务必小心,确保递归函数能够正确终止,避免出现无限循环的情况。
四.对象的方法
在JavaScript中对象的方法是指对象中的函数。对象的方法可以通过对象的的属性来调用。
var person = {
name: "wyc",
age: 21,
greet: function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
};
person.greet(); // 输出: Hello, my name is wyc and I am 21 years old.
像这样调用它