欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS函数:具名函数、匿名函数、自执行函数

程序员文章站 2024-02-26 19:32:34
...

JS函数:具名函数、匿名函数、自执行函数

一、具名函数

具名函数,故名思意就是有名字的函数,具名函数一般是我们定义的最多的一种

// 函数
function fn() {
    console.log('我是具名函数')
    console.log('看,我有名字')
    console.log('我的名字叫 fn')
}
fn()
fn()

我们在上述代码中定义了一个函数fn,然后将函数调用了两次,结果非常简单,函数中的内容会被输出两次

console.log('我是具名函数')
console.log('看,我有名字')
console.log('我的名字叫 fn')
console.log('我是具名函数')
console.log('看,我有名字')
console.log('我的名字叫 fn')

我们尝试不使用函数,可以看到代码没有我是用函数方便阅读
如果我们还需要输出更多次 ?
使用函数的话,我们就只需要调用 fn 即可
下面代码就得把代码复制一边 所以会导致代码会非常的冗余
所以得出,具名函数的好处就是,减少冗余代码方便代码阅读可以多次调用

二、匿名函数

没有名字的函数,匿名函数我们也随处可见,我们来写几个匿名函数

setTimeout(function () {
  console.log('我是匿名函数,我被用于定时器参数传递')
}, 1000)

let arr = [1, 2, 3]
arr.forEach(function (item) {
  console.log('我是匿名函数,我被用于回调函数参数')
})

let box = document.querySelector('#box')
box.onclick = function () {
  console.log('我是匿名函数,我被用于绑定事件')
}

匿名函数一般被用作,回调函数参数事件绑定

function fn(){
  console.log('我是一个具名函数')
}
setTimeout(fn)
fn()

我们用具名函数仍然是可以实现上面的代码的,但是我们为什么要使用匿名函数呢?
匿名函数不会创建变量,所以说在内存上就不会造成不必要的浪费,还有就是代码看上去会更加简洁,但是匿名函数不能重复调用

DOM2匿名函数的一点小坑
dom取消事件

我们只需要把onclick赋值为null就可以了

let box = document.querySelector('#box')
box.onclick = function () {
  console.log('我是匿名函数')
}
box.onclick = null
dom2取消事件

addEventListener(type, function, options):绑定某个事件
removeEventListener(type, function, options):移除某个事件

我们使用匿名函数

let box = document.querySelector('#box')
box.addEventListener('mousemove',function () {
  console.log('我是匿名函数')
})
box.removeEventListener('mousemove',function () {
  console.log('我是匿名函数')
})

可以看见移除是失败的

再试试具名函数

let box = document.querySelector('#box')
function fn(){
  console.log('我是具名函数')
}
box.addEventListener('click',fn)
box.removeEventListener('click',fn)

可以看见我们监听的事件被移除了
总结 在使用DOM2事件绑定的时候,如果我们有要移除事件的逻辑,请不要使用匿名函数,因为匿名函数我们是无法用代码找到该函数的。

三、自执行函数

在定义的时候就调用这个函数

(function () {
 console.log('我是一个自执行函数')
})()

我们可以看见这个函数在刚被定义出来就被执行了
为什么要使用自执行函数呢,为什么不直接写呢,你又不可以调用两次,我又不绑定事件????
JS函数:具名函数、匿名函数、自执行函数

作用域

作用域得有变量作为参照物
我们的函数在执行的时候就会形成自己私有的作用域

我们举个栗子例子

function fn() {
  var num = 10;
}
fn()

console.log(num)// Uncaught ReferenceError: num is not defined

解释: 我们在函数中定义了一个变量num,我们想在外面去访问这个num,但是告诉我们num这个变量没有定义。
但是我不是在函数中定义了吗????
JS函数:具名函数、匿名函数、自执行函数
先不急我们再来看一段代码

var num = 10
function fn() {
  console.log(num)// 10
}
fn()

运行这段代码却没有报错,我们来看一下下面这幅图理解一下
JS函数:具名函数、匿名函数、自执行函数
结论

  1. 函数执行会有自己的作用域
  2. 函数中的变量全局访问不到(不会污染全局)

看到这里大家应该还是不知道自执行函数是干嘛的,别急,我们继续向下看
JS函数:具名函数、匿名函数、自执行函数
我们来一个实例来解释

假如我们团队要写京东,然后我们需要给每个人分配任务,一个人写一个板块,我们要怎样才能保证每个人定义的变量不重复呢???
此时我们就需要用到自执行函数形成的作用域了

JS函数:具名函数、匿名函数、自执行函数
代码实现如下

/* 这是张三的代码 */
(function(){
  var a = 10;
  console.log(a)
})();

/* 这是李四的代码 */
(function () {
  var a = 5
  console.log(a)
})();

这样每个人的代码都不会影响到别人的代码

JS函数:具名函数、匿名函数、自执行函数