3、函数定义,函数调用,this指向总结,闭包

news2024/11/6 3:01:06

一、函数的定义方式

1、函数声明

function demo1() {
  var num = 12
  var result = Math.pow(num,2)//指数函数
  return result
}

2、函数表达式

var demo2 = function (x,y) {
//内置对象arguments前面的两个参数  是 x,y
  var sum = arguments[0] + arguments[1]
  console.log(sum)
}

3、构造函数

var demo3 = new Function("x","y","return x+y")

二、函数的调用方式

1、函数名()

console.log(demo1())//144
demo(10,20)//30
var re = demo3(1.2,1.3)
console.log(re)//2.5

2、call() / apply()

console.log(demo1.call())//144
console.log(demo1.apply())//144
demo2.call(window, 1, 2)//3
demo2.apply(null, [4, 5])//9

3、自调用

函数表达式自调用

var fn1 = (function () {
  console.log('this is function')//this is function
})()

匿名函数

(function () {
  console.log('我是匿名函数')//我是匿名函数
})()

4、对象中的函数调用

var obj = {
  school: '学校',
  study: function () {
    console.log('我是对象的函数')//我是对象的函数
  },
}
//要用obj去调用  因为所属对象是obj
  obj.study()

5、数组中函数的调用

var arr = [10,'0',undefined,null,false,[2, 3],
    function () {
      console.log('我是函数也是数组的元素')//我是函数也是数组的元素
      console.log(this)
      //[10, '0', undefined, null, false, Array(2), ƒ, {…}]
    },
    {},
  ]
  arr[6]()

6、函数当做参数调用

function demo4(x) {
  x()
}
demo4(function () {
  alert('我是函数也是demo4的参数')//弹窗 我是函数也是demo4的参数
})

7、函数当做返回值的调用

function demo5() {
  return function () {
	console.log('我是函数也是demo5的返回值')
  }
}
demo5()()

如果函数A的返回值是匿名函数B,想要调用匿名函数B 直接再函数A 后面加两个小括号

三、函数中this指向问题(总结)

  • 1、在普通函数中this指向window
function fn1() {console.log(this)}
fn1()//window
  • 2、在定时器函数中this指向window
var timer = setInterval(function(){
    console.log(this);//window
},2000)
  • 3、在事件函数中this指向事件源
var btn = document.getElementById("btn")
btn.onclick = function() {
  console.log(this)//btn
}
  • 4、在对象函数中this指向当前对象
var name = "this window"
var object = {
    name: 'this object',
    getName: function () {
    //this object在对象函数中this指向当前对象(this指向)
        console.log(this.name);
    	console.log(name);//this window 当前没有  往上查找(作用域链查找)
    }
}
object.getName()
  • 5、在构造函数中this指向实例化对象
function Person(age,name) {
	this.age = age
	this.name = name
	consoel.log(this)//this指向Person的实例对象p1
}
var p1 = new Person(18,;'张哈哈')
  • 6、在原型函数中
    • 如果原型调用,this指向原型
    • 如果实例化对象调用,this指向实例化对象
  • 7、在数组函数中this指向当前数组

四、闭包

1、作用域

有且只有函数 才可以产生作用域

全局作用域(永恒作用域)

  • 全局变量
  • 在任何作用域内都有效
  • 生命周期:浏览器打开时创建,关闭时销毁

局部作用域

  • 局部变量
  • 只在当前作用域内有效
  • 生命周期:函数调用时创建,调用完成后销毁

2、闭包的定义?

  • 定义在函数内部的函数

3、闭包的作用?

获取父函数内部的变量

console.log(count)//获取不到  因为count是局部的
var num = 15
function parent() {
  console.log(num)//15 num是全局的
  var count = 12.4
  // 闭包函数的本质
  // 局部作用域--parent,相对于child作用域是永恒的,本身是作用域是短暂的 
  function child() {
  //  局部作用域--child
  console.log(count)
  }
  child()
}
parent()

锁住父函数内部的变量

// 随机数案例
var getRandom = function (min, max) {
    var num = Math.floor(Math.random() * (max - min) + min)
    return function(){
        console.log(num);
    }
}
var result = getRandom(10, 20)
// 两次结果一样 因为父元素执行一次 
result()
result()
var btn = document.getElementById("btn")
btn.onclick = (function () {
  var count = 0
  return function () {
    count++
    console.log(this)
    //由于事件是异步的,所以自调用的是父函数,此时父函数是匿名函数,所以单击事件调用闭包函数
    this.innerText = "点赞(" + count + ")"
  }
})()

image-20240226195738360

4、闭包函数的本质?

  • 让父函数相对于闭包函数是永恒作用域

5、闭包作用域之获取复函数内部变量

  • this 指向 作用域链的查找规则 预解析 闭包
var name = "this window"
var object = {//不会产生作用域
     name: 'this object',
     getName: function () {//局部作用域
        console.log(this.name);//在对象函数中this指向当前对象
        console.log(name);//在当前作用域查找  undefined
        var name = "this getName"//var name提升
        return function () {
            console.log(this.name);//普通函数 this指向window
            console.log(name);//this getName  当前作用域没有 往上一级查找
        }
    }
} 
object.getName()()
var name = "this window"
var object = {//不会产生作用域
    name: 'this object',
    getName: function () {//局部作用域
        console.log(this.name);//this object 在对象函数中this指向当前对象
        console.log(name);//在当前作用域查找  undefined
        var name = "this getName"//var name提升
        return function () {
            function name(){
                console.log('我是函数声明');
            }
            var name = function () {
                console.log(this.name);//普通函数指向window
            }
        //this object  因为this 指向bind(this)中的this bind的指向object
            console.log(this.name);
            console.log(name);//this getName函数  当前作用域有name 函数表达式覆盖函数声明
            name()
        }.bind(this)
        return name
    }
}
object.getName()()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web组态插件

插件演示地址:http://www.byzt.net 关于组态软件,首先要从组态的概念开始说起。 什么是组态 组态(Configure)的概念来自于20世纪70年代中期出现的第一代集散控制系统(Distributed Control System)&#xf…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像,这种情况下编写dockerfile文件不可避免,本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令: env指令用于设置shell的环境变量&am…

渗透测试—信息收集

渗透测试—信息收集 1. 收集域名信息1.1. 域名注册信息1.2. SEO信息收集1.3. 子域名收集1.3.1. 在线子域名收集1.3.2. 子域名收集工具 1.4. 域名备案信息1.5. ICP备案号查询1.6. SSL证书查询 2. 收集真实IP2.1. 超级ping2.2. Ping2.3. CDN绕过 3. 收集旁站或C段IP3.1. 旁站或C段…

一款非常专业的图形设计工具CorelDRAW2024中文破解版

CorelDRAW2024(简称CDR2024)是一款非常专业的图形设计工具,该产品推出了全新的2023版本,在功能和体验上更进一步,最新的填充和透明设备功能可以完全控制任何类型的纹理,适用于网络摄影、印刷项目、艺术、排…

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 VRPSPD的文献较多,求解目标多以最小化车辆行驶距离为主,但现实中可能存在由租赁费用产生的单次派出成本,需要综合考 虑单次派车成本和配送路径成本。…

JetBrains系列工具,配置PlantUML绘图

PlantUML是一个很强大的绘图工具,各种图都可以绘制,具体的可以去官网看看,或者百度。 PlantUML简述 https://plantuml.com/zh/ PlantUML语言参考指引 https://plantuml.com/zh/guide PlantUML语言是依赖Graphviz进行解析的。Graphviz是开源…

Superhuman 邮箱的替代方案是什么?

Superhuman是一个极好的人工智能工具在电子邮件助理领域。根据SimilarWeb的最新统计,它在全球网站排名中排名第21980位,月访问量为1751798。然而市场上还有许多其他优秀的选择。为了帮助您找到最适合您需求的解决方案,我们为您精心挑选了10种…

快让Live2D小可爱住进你的网站吧

文章目录 一、效果请欣赏二、教程1.下载项目工程2.本地自行修复测试3. 测试 一、效果请欣赏 二、教程 1.下载项目工程 github地址 可以根据工程的readme来使用demo测试,demo中需要修改 autoload.js api的cdnPath或者apiPath,否则加载不出来人物图片 api…

10个Premiere创意设计项目列表文字清单视频模板素材

10个创意设计项目列表文字清单pr模板视频制作素材,高清分辨率:19201080,Premiere Pro 2019项目,无需插件,包括视频教程,预览图像不包括音频不包括。 更多PR素材下载:https://prmuban.com/37908.…

vue2.0及起步(前端面试知识积累)

1、需要了解的vue概要知识 1、vue是什么? 一套用于构建用户界面的渐进式JavaScript框架。 为什么vue被称为是渐进式JS框架? 答:Vue允许开发者在不同的项目中以渐进式的方式使用它,这种渐进式表现在以下的方面: 逐步采…

linux中将普通用户添加sudo权限

1.登录root权限账号,编辑/etc/sudoers文件 2.找到"root ALL(ALL) ALL",并在下面添加普通用户 格式:username ALL(ALL) ALL vim /etc/sudoers ## Next comes the main part: which users can run what software …

搜维尔科技:【周刊】适用于虚拟现实VR中的OptiTrack

适用于 VR 的 OptiTrack 我们通过优化对虚拟现实跟踪最重要的性能指标,打造世界上最准确、最易于使用的广域 VR 跟踪器。其结果是为任何头戴式显示器 (HMD) 或洞穴自动沉浸式环境提供超低延迟、极其流畅的跟踪。 OptiTrack 主动式 OptiTrack 世界领先的跟踪精度和…

调度服务看门狗配置

查看当前服务器相关的sqlserver服务 在任务栏右键,选择点击启动任务管理器 依次点击,打开服务 找到sqlserver 相关的服务, 确认这些服务是启动状态 将相关服务在看门狗中进行配置 选择调度服务,双击打开 根据上面找的服务进行勾…

【C进阶】顺序表详解

文章目录 📝线性表的概念🌠 顺序表🌉顺序表的概念 🌠声明--接口🌉启动🌠初始化🌉扩容🌠尾插🌉 打印🌠销毁🌉 尾删🌠头插🌉…

【大厂AI课学习笔记NO.54】2.3深度学习开发任务实例(7)数据标注和数据集拆分

数据标注 有时我们会把特征工程和数据集的标注弄混淆,在普通的机器学习项目中,我们需要进行特征工程,但是在深度学习项目过程中,我们需要进行数据标注工作。 标注工具 在本案例中,使用的是开源的标注工具Labelme&am…

SSMBUG之 url +

1. Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. 经查, 书写一切正常. 注意到此时yml文件的图标是一个红色的Y而不是绿色的spring , 推测没有正确加载. 重新创建项目, 所有东西拷贝一份便恢复正常…

递归与回溯(一)

递归 递归一定要有出口,不然会无限调用,死循环 string fun(int n){if(n0)return "a";if(n1)return "b";return fun(n - 1) fun(n - 2); }输出前8种结果: 双写数字递归例子 注意递归的return int doubleNum(int n){i…

内衣洗衣机哪个牌子好用?甄选安利四款优质好用的内衣洗衣机

内衣洗衣机是近几年新兴的一种家用电器产品,正日益引起人们的重视。但是,面对市面上品牌繁多、款式繁多的内衣洗衣机,使得很多人都不知道该如何选择。身为一个数码家电博主,我知道这类产品在挑选方面有着比较深入的了解。为此&…

python3GUI--酷狗音乐By:PyQt5(附下载地址)

文章目录 一.前言二.展示1.主界面2.乐库3.歌单3.频道4.视频5.我的频道6.视频7.听书8.探索9.其他细节1.搜索中间页2.主菜单3.歌单详情4.托盘菜单 三.心得四.总结 一.前言 之前仿作了几款音乐播放器,有的有功…

【底层解读】ArrayList源码学习

成员变量 学习源码前,我们还是先看一下ArrayList中成员变量有哪些 构造函数 ArrayList一共有三个构造函数。 第一个:带有指定初始容量的构造函数 第二个:空参构造 第三个:包含指定集合的构造函数 OK,看完构造函数&a…