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

一、函数的定义方式

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

var list = document.querySelectorAll("#list>li")
for (var i = 0; i < list.length; i++) {
    (function (i) {
        setTimeout(function () {
            console.log('索引:'+i);
            console.log('文本值:'+list[i].innerText);
        },3000)
    })(i)
}
image-20240227094051418

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()()

五、闭包练习题

var x = 11
function fn(x) {
    //形参x  相当于var x = 2
    console.log(x);//2   fn(2)实参传给x
    x = 10
    console.log(x);//10 x重新赋值为10
    rguments[0] = 20   //fn的第一个参数是x  所以x重新赋值为20
    onsole.log(x);//20  

fn(2)
console.log(x);//11 全局作用域
var x = 11
function fn(x) {
    //相当于 var x  没赋值
    console.log(x);//undefined
    x = 10
    console.log(x);//10
    // console.log(arguments); 数组元素是实参
    arguments[0] = 20
    console.log(x);//10
}
fn()
console.log(x);//11 全局作用域
var x = 11
function fn(x) {
    // var x = 11
    console.log(x);//11
    x = 10
    console.log(x);//10
    arguments[0] = 20
    console.log(x);//20
}
fn(x)//11
console.log(x);//11  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32用CubeMX库控制OLED显示数字,单个字符,字符串

首先是打开proteus绘制电路图&#xff1a; 接着就是打开CubeMX软件&#xff0c;配置晶振和GPIO口&#xff1a; 接下来就用前面讲过的方法添加一个自己的代码文件夹和代码了&#xff1a; 下面是OLED.c文件&#xff0c;复制就能用&#xff1a; #include "OLED_Font.h"…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的&#xff0c;遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化&#xff0c;但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析&#xff0c;另外还要了解什么样的语句会不走索引&#xff01;本文通过几个简单的例子…

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

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

不只是数字游戏:六西格玛培训让数据讲述餐厅故事

随着时代的进步和科技的发展&#xff0c;人们对食品安全、健康以及就餐体验的要求日趋增高。这些因素推动了餐饮服务行业不断向前演进&#xff0c;以顺应消费者的多变需求。在2024年&#xff0c;这一行业预计将继续经历创新和变化&#xff0c;其中包括对运营效率的持续改进、对…

状态机-----

1.原理 同步的意思就是状态的跳转都是在时钟的作用下跳转的&#xff0c;有限是指状态机中状态的个数是有限的。两种状态机的共同点都是状态的跳转只和输入有关&#xff0c;区别就是如果最后的输出只和当前状态有关而与输入无关&#xff0c;则是moore型状态机。如果最后的输出不…

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…

如何让网页APP化 渐进式Web应用(PWA)

前言 大家上网应该发现有的网页说可以安装对应应用&#xff0c;结果这个应用好像就是个web&#xff0c;不像是应用&#xff0c;因为这里采用了PWA相关技术。 PWA&#xff0c;全称为渐进式Web应用&#xff08;Progressive Web Apps&#xff09;&#xff0c;是一种可以提供类似…

索引使用规则1——最左前缀法则

这篇文章主要介绍索引的使用规则——最左前缀法则&#xff0c;关于索引的效率&#xff0c;可以查看上一篇文章索引的有效性 最左前缀法则&#xff1a;索引使用了复合索引&#xff0c;也就是联合索引&#xff0c;使用一个索引名称索引了好几个字段。在这类索引中需要遵守最左前…

华为云是什么

公有云配置 区域&#xff1a; 同一个区域中的云主机是可以互相连通的&#xff0c;不通区域云主机是不能使用内部网络互相通信的 选择离自己比较近的区域&#xff0c;可以减少网络延时卡顿 华为云yum仓库&#xff1a;https://repo.huaweicloud.com/rockylinux/ 首先完成跳板机的…

文件拖放到窗体事件

参考代码 参考链接 拖放文件到窗体_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV13d4y1h7vr/?spm_id_from333.999.0.0&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年2月27日

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

【linux进程信号(一)】信号的概念以及产生信号的方式

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程信号 1. 前言2. 信号的基…

MySQL集群 双主架构(配置命令)

CSDN 成就一亿技术人&#xff01; 今天刚开学第一天给大家分享一期&#xff1a;MySQL集群双主的配置需求和命令 CSDN 成就一亿技术人&#xff01; 神秘泣男子主页&#xff1a;作者首页 <———— MySQL专栏 &#xff1a;MySQL数据库专栏<———— MySQL双主是一…

WEB服务器-Tomcat(黑马学习笔记)

简介 服务器概述 服务器硬件 ● 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说服务器应具备承担服务并且保障…

C++笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径

C++笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径 参考博文: 1.C++笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径 2.Linux笔记之LD_LIBRARY_PATH详解 3.qt-C++笔记之使用QProcess去执行一个可执行文件时指定动态库所存放的文件夹lib的路径 c…

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1&#xff0c;视频地址 【wails】&#xff08;4&#xff09;&#xff1a;使用wails做桌面应用开发&#xff0c;整合chatgpt-web项目做前端&#xff0c;进行本地开发&#xff0c;web端也可以连调&#xff0c;使用websocket实现 2&#xff0c;演示效果 启动先是报500 错误&#…

最新 WebStorm 2023.3.4 激活

Stage 1 : 官网下载 Stage 2 : 下载工具 Stage 3-1 : windows为例 Stage 3-2 : mac为例 常见问题 Stage 1 : 官网下载 先去官网下载 Thank you for downloading WebStorm! 我这里下载的是最新版本的2023.3.4&#xff0c;测试过2023最新版本以及2022版本以上的版本没问题…

成为一名优秀的项目经理需要哪些技能?

成为一名优秀的项目管理专员需要具备以下技能和素质&#xff1a; 1. **沟通能力**&#xff1a;项目管理专员需要与团队成员、利益相关者、客户等进行有效沟通。这包括书面和口头沟通&#xff0c;确保信息的准确传达和理解。 2. **组织能力**&#xff1a;管理项目涉及许多任务和…

初谈软件工程(一)

我就读于兰州交通大学的软件工程专业。虽然在全国众多的985、211高校中&#xff0c;兰州交通大学可能并不显眼&#xff0c;似乎未能跻身这些所谓的“顶尖”行列就意味着不被认可。然而&#xff0c;在甘肃省的教育领域中&#xff0c;它无疑是一座璀璨的明珠&#xff0c;名列前茅…