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

一、函数的定义方式

1、函数声明

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

2、函数表达式

var demo2 = function (x,y) {
//内置对象arguments前面的两个参数  是 x,yvar 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去调用  因为所属对象是objobj.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 = agethis.name = nameconsoel.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() {//  局部作用域--childconsole.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 = 0return 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);//在当前作用域查找  undefinedvar name = "this getName"//var name提升return function () {console.log(this.name);//普通函数 this指向windowconsole.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);//在当前作用域查找  undefinedvar 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的指向objectconsole.log(this.name);console.log(name);//this getName函数  当前作用域有name 函数表达式覆盖函数声明name()}.bind(this)return name}
}
object.getName()()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUGKU-WEB 备份是个好习惯

题目描述 题目截图如下: 进入场景看看: 解题思路 看源码看提示:备份是个好习惯扫描目录md5弱比较 相关工具 御剑md5解密:https://www.somd5.com/ 解题步骤 看到的这串字符,有点像md5? d41d8cd98…

面试总结之JVM入门

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀你为什么要学习JVM?🎀JVM的作用 🎀JVM的构成(5大类)🏨1.类加载系统🐕类什么时候会被加…

【Flink精讲】Flink状态及Checkpoint调优

RocksDB大状态调优 RocksDB 是基于 LSM Tree 实现的(类似 HBase) ,写数据都是先缓存到内存中, 所以 RocksDB 的写请求效率比较高。 RocksDB 使用内存结合磁盘的方式来存储数据,每 次获取数据时,先从内存中 …

1.0 RK3399项目开发实录-Ubuntu环境搭建(物联技术666)

1.下载Ubuntu所需的版本:Index of /releases 2.安装vmplayer:Download VMware Workstation Player | VMware 3.安装Ubuntu时,磁盘空间尽量大些,开发板系统包都比较大,避免存不下,建议空间100G。 关闭Ubuntu自动更新…

ConvNeXt V2:用MAE训练CNN

论文名称:ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 发表时间:CVPR2023 code链接:代码 作者及组织: Sanghyun Woo,Shoubhik Debnath来自KAIST和Meta AI。 前言 ConvNextV2是借助MAE的思想来训练…

网络安全与信创产业发展:构建数字时代的护城河

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…

再见,Visual Basic——曾经风靡一时的编程语言

2020年3月,微软团队宣布了对Visual Basic(VB)的“终审判决”:不再进行开发或增加新功能。这意味着曾经风光无限的VB正式退出了历史舞台。 VB是微软推出的首款可视化编程软件,自1991年问世以来,便受到了广大…

编曲学习:和声小调 终止式 离调和弦 转调应用

和声小调 音阶 大调音程关系排列:全 全 半 全 全 全 半 小调音程关系排列:全 半 全 全 半 全 全 C大调音阶: 1 2 3 4 5 6 7 1 C小调音阶: 1 2 b3 4 5 b6 b7 1 C大调基本音级构成的和弦: Cmaj7 Dmin7 Emin7 Fmaj7 G7 Amin7 Bm7-5 C小调基本音级构成的和弦: Cmin7 D…

【web APIs】1、(学习笔记)有案例!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、概念二、使用步骤1.获取DOM对象2.操作元素内容3.属性修改3.1.常用属性修改3.2.控制样式属性3.3.操作类名(className) 操作CSS3.4.操作表单元素属性3.5.自定…

【Excel PDF 系列】EasyExcel + iText 库

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 文章目录 前言转换前后效果引入 pom 配置代码实现定义 ExcelDataVo 对象主方法EasyExcel 监听器 前言 最近遇到生成 …

JVM跨代引用垃圾回收

1. 跨代引用概述 在Java堆内存中,年轻代和老年代之间存在的对象相互引用,假设现在要进行一次新生代的YGC,但新生代中的对象可能被老年代所引用的,为了找到新生代中的存活对象,不得不遍历整个老年代。这样明显效率很低…

如何移除禁用WordPress默认小工具(附WordPress默认小工具名称)

WordPress 自带的小工具非常多,但是我们用到的也就那么几种,甚至一种都不会用到,所以很有必要注销(去除)掉一些不用的小工具。实现的方法也很简单,只需将以下代码,根据自己的情况删除需要用的小…

Atcoder ABC341 E - Alternating String

Alternating String(交替字符串) 时间限制:3s 内存限制:1024MB 【原题地址】 所有图片源自Atcoder,题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 每个查询 q u e r y i query…

clip_as_service学习

参考:clip_as_service学习过程(一)——安装客户端与服务端_clip-as-service-CSDN博客 CLIP-as-service 0.8.3 documentation (jina.ai) pip3 install clip-client /usr/local/python3/bin/python3.7 -m pip install --upgrade pip pip3 install clip-server pyt…

TensorFlow2.x 精选笔记(2)自动求导与概率

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

重新安装VSCode后,按住Ctrl(or Command) 点击鼠标左键不跳转问题

重新安装VSCode后,按住Ctrl(or Command) 点击鼠标左键不跳转问题 原因:重新安装一般是因为相应编程语言的插件被删除了或还没有下载。 本次是由于Python相关的插件被删除了,因此导致Python无法跳转。 解决办法 在vs…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined,这是由于配置babel出错问题,由于使用了es7语法如async/await而当前babel版本过低 解决: npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置: &qu…

rabbitmq知识梳理

一.WorkQueues模型 Work queues,任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。 当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多&#xff0c…

AI赋能Oracle DBA:以自然语言与Oracle数据库互动

DBA AI助手:以自然语言与Oracle数据库互动 0. 引言1. AI赋能Oracle DBA的优势2. AI如何与Oracle数据库交互3. 自然语言查询的一些示例4. 未来展望 0. 引言 传统的Oracle数据库管理 (DBA) 依赖于人工操作,包括编写复杂的SQL语句、分析性能指标和解决各种…