JavaScript从零开始学习第5天

一.闭包

广义上有一定作用域的代码块就可以称之闭包。目前我学习的相较狭义,闭包是指函数可以访问和操作函数外部的变量,即使在函数外部调用该函数时,仍然可以使用外部变量。在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.

像这样调用它

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值