当前位置: 首页 > news >正文

js学习5(函数)

目录

定义函数

函数的特性 

使用函数模拟类

 模拟私有属性和方法

 闭包

函数特性利用

箭头函数


定义函数

function func1(name) {
    console.log(name);
}
func2 = function (name) {
    console.log(name);
}
func3 = function func0(name) {
    console.log(name);
}
console.log(typeof func0); // undifined >> 变量转移
console.log(typeof func1); // function
console.log(typeof func2); // function
console.log(typeof func3); // function
func1('joden'); // joden
func2('joden'); // joden
func3('joden'); // joden
func0('joden'); // func0 is not defined

函数的特性 

1. 一次定义多次使用

2. 声明的变量为函数内部作用域

3. 函数体中是新开辟的代码块(可以定义变量、函数等等)

4. 函数可以有返回值

使用函数模拟类

## 思路:
(1) 定义一个方法,内部可以定义变量或方法,把他们当做属性和方法;
(2) 定义一个变量名作为类,然后使外部方法等于该变量;
(3) 让方法暴露出来,让其返回一个对象,这样我们可做满足obj.name/obj.func();
(4) 让对象映射到外部函数内部定义的属性和方法
## 代码:
var myClass = function(name) {
    var name = name;
    function func1(val) {
        console.log(val);
    }
    return {
        name: name,
        func1:func1,
    }
};
c = myClass('joden');
console(c.name);
c.func1('666666');

 模拟私有属性和方法

### 模拟私有属性和方法
## 思路:
(1) 方法内部的变量和方法不就是方法私有的
(2) 结合前面还要满足类,不让定义的方法和属性暴露出来就可以了
## 代码
var myClass = function (name) {
    var name = name;
    function func1(val) {
        console.log(val);
    }
    // 私有属性
    let info;
    // 私有方法
    function func2(new_name) {
        info = 'hello '+new_name;
        return info;
    }
    function func3(new_name) {
        return func2(new_name);
    }
    return {
        // 只暴露类方法和属性
        name:name,
        func1:func1,
        func3:func3,
    }
}
var c2 = myClass('joden')
console.log(c2.name);;
c2.func1('66666');
res = c2.func3('lisi');
console.log(res);

 闭包

其实上面两个模拟用到了闭包,不过是不经意间的(看一下简单的闭包形式)
function outter(){
    ...
    function inner(){
        ...
    }
    return inner;
}
out = outter();
out();

函数特性利用

其实上面两个模拟也利用了函数的局部作用域特点;
函数还可以用来防止变量作用域污染,如下:
(function(){
    ...
})();

(function(){
    ...
})();
像上面,我们可以定义许多匿名函数使其自执行,而每个函数内部定义的变量又是作用于其内部的,可以避免【域污染】的问题;
注意:因为是方法形式所以不要忘记加括号执行和加分号终止。

箭头函数

## 定义与使用
1. var func = name=>name;
2. var add = (a,b)=>a+b;
3. 作为回调函数处理对象
console.log(func('joden'));
console.log(add(1,2));## 箭头函数中this的含义
首先this是对象所独有的(常用this.*)
所以我们接下来可以写个测试类来看下指向问题(也就是指向哪个对象)## 1. 从对象开始
obj = {a:1,b:function () {console.log(111,this);},c: ()=> {console.log(222,this); },// 再嵌套一层对象d:{da:function () {console.log(333,this);},db:()=>{console.log(444,this);},},// 闭包e:function () {var ea = ()=>{console.log(555,this);}return ea();}
}obj.b();    // 1.1 匿名函数,指向当前对象
obj.c();    // 1.2 箭头函数,忽略了当前的对象,指向window
obj.d.da();     // 1.3 匿名函数,当前对象
obj.d.db();     // 1.4 箭头函数,忽略了当前对象,指向window
obj.e();    // 1.5 用了闭包,指向闭包所在对象## 2. 补充示例
obj2_simple = {a:1,b:function () {var ba = ()=>{console.log(this);}return ba}
}
obj2.b();## 3. 回调函数测试
<button id="btn">点击</button>  
<script>var btn = document.getElementById('btn');btn.onclick = function () {console.log(111,this);  // 3.1 匿名函数指向btn对象}btn.onclick = ()=>{console.log(222,this);  // 3.2 箭头函数指向window对象}btn.onclick = function () {var inner = ()=>{console.log(222,this);  // 3.3 闭包,箭头函数指向对象btn(当然这样做多此一举)}return inner()
}
</script>## 4. 总结:
回调函数用箭头函数,找不到对象自身,而用匿名函数可以(所以回调函数不要用箭头函数)

相关文章:

js学习5(函数)

目录 定义函数 函数的特性 使用函数模拟类 模拟私有属性和方法 闭包 函数特性利用 箭头函数 定义函数 function func1(name) { console.log(name); } func2 function (name) { console.log(name); } func3 function func0(name) { console.log(name); } co…...

用Qt画一个仪表盘

关于Qt Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;通过使用Qt&#xff0c;可以快速开发出跨平台的多平台应用程序&#xff0c;包括Windows、Mac OS X、Linux和其他Unix系统。Qt提供了强大的图形操作界面&#xff08;GUI&#xff09;程序开发和移植的能力&#xf…...

linux 端口查询命令

任何知识都是用进废退&#xff0c;有段时间没摸linux&#xff0c;这大脑里的知识点仿佛全部消失了&#xff0c;就无语。 索性&#xff0c;再写一篇记录&#xff0c;加强一下记忆&#xff0c;下次需要就看自己的资料好了。lsof命令Linux端口查询命令可以通过lsof实现&#xff1a…...

C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()

C语言函数&#xff1a; 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用&#xff1a;字符串查找。在一串字符串中&#xff0c;查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char*的指针 原理&#xff1a;如果在str1中找到了str2&…...

【学习笔记】人工智能哲学研究:《心智、语言和机器》

关于人工智能哲学&#xff0c;我曾在这篇文章里 【脑洞大开】从哲学角度看人工智能&#xff1a;介绍徐英瑾的《心智、语言和机器》 做过介绍。图片来源&#xff1a;http://product.dangdang.com/29419969.html在我完成了一些人工智能相关的工作以后&#xff0c;我再来分享《心智…...

设计模式之门面模式(外观模式)

目录 1.模式定义 2.应用场景 2.1 电源总开关例子 2.2 股民炒股场景 ​编辑 3. 实例如下 4. 门面模式的优缺点 传送门&#xff1a; 项目中用到的责任链模式 给对象讲工厂模式&#xff0c;必须易懂易会 策略模式&#xff0c;工作中你用上了吗&#xff1f; 1.模式定…...

MySQL - 多表查询

目录1. 多表查询示例2. 多表查询分类2.1 等/非等值连接2.1.1 等值连接2.1.2非等值连接2.2 自然/非自然连接2.3 内/外连接2.3.1 内连接2.3.2 外连接3.UNION的使用3.1 合并查询结果3.1.1 UNION操作符3.1.2 UNION ALL操作符4. 7种JOIN操作5. join 多张表多表查询&#xff0c;也称为…...

自定义报表是什么?

自定义报表是指根据用户的需求和要求&#xff0c;自行设计和生成的报表。自定义报表可以根据用户的具体需求&#xff0c;选择需要的数据和指标&#xff0c;进行灵活的排列和组合&#xff0c;生成符合用户要求的报表。自定义报表可以帮助用户更好地了解业务情况&#xff0c;发现…...

windows安装docker-小白用【避坑】【伸手党福利】

目录实操开启 Hyper-V 和容器特性下载docker安装dockercmd中&#xff0c;使用命令测试是否成功报错解决办法&#xff1a;下载linux模拟器wsl&#xff1a;双击打开docker重新打开cmd&#xff0c;输入命令&#xff0c;成功显示sever和clinet实操 开启 Hyper-V 和容器特性 控制面…...

环形链表相关的练习

目录 一、相交链表 二、环形链表 三、环形链表 || 一、相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据…...

C++ 提示对话框

头文件 #include<iostream>#include<cstdio> using namespace std; 函数格式 MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) 参数 hWnd &#xff1a;此参数代表消息框拥有的窗口。如果为NULL&#xff0c;则消息框没有拥有窗口。 lp…...

SprintBoot打包及profile文件配置

打成Jar包 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中&#xff0c;可以使用maven的package&#xff1b;运行: java -jar xxx(jar包名) 操作步骤 第一步: 引入Spring Boot打包插件 <!--打包的插件--> <build><!--修改jar的名字--><fi…...

java面试-java集合

说说你如何选用集合&#xff1f; 需要键值对选用 map 接口下的集合&#xff0c;需要排序用 TreeMap, 不需要排序用 HashMap 不需要键值对仅存放元素则选择 Collection 下实现的接口&#xff0c;保证元素唯一使用 Set, 不需要则选用 List Collection 和 Collections 有什么区别…...

Node.js简介

客户端访问网页时向服务器端发送请求要访问服务器中的页面&#xff0c;服务器收到请求后向数据库中进行搜索&#xff0c;搜索到相关数据然后返回结果给客户端显示&#xff1b; 这个过程就类似于&#xff1a;客人&#xff08;客户端&#xff09;去饭馆&#xff08;服务端&#…...

每天学一点之Lambda表达式

Lambda表达式 思想导入&#xff1a; 函数式编程思想&#xff1a; 在数学中&#xff0c;函数就是有输入量、输出量的一套计算方案&#xff0c;也就是“拿什么东西做什么事情”。编程中的函数&#xff0c;也有类似的概念&#xff0c;你调用我的时候&#xff0c;给我实参为形参赋…...

Raft分布式共识算法学习笔记

1. Raft算法 Raft算法属于Multi-Paxos算法&#xff0c;它是在Multi-Paxos思想的基础上&#xff0c;做了一些简化和限制&#xff0c;比如增加了日志必须是连续的&#xff0c;只支持领导者、跟随者和候选人三种状态&#xff0c;在理解和算法实现上都相对容易许多 从本质上说&am…...

中介者模式

介绍 Java中介者模式(Mediator Pattern)是一种行为设计模式,它可以降低多个对象之间的耦合性,通过一个中介者对象来协调这些对象的交互. 在中介者模式中,多个对象之间的交互不是直接进行的,而是通过一个中介者对象来进行的.这个中介者对象封装了对象之间的交互逻辑,每个对象只…...

Kaggle赛题解析:Google手语识别

文章目录一、比赛前言信息二、比赛背景三、比赛任务四、评价指标五、数据描述六、解题思路一、比赛前言信息 比赛名称&#xff1a;Google - Isolated Sign Language Recognition 中文名称&#xff1a;帮助用户从PopSign游戏学习美国手语 比赛链接&#xff1a;https://www.ka…...

什么是ChatGPT?

目录前言一、什么是GPT&#xff1f;二、什么是ChatGPT&#xff1f;三、ChatGPT应用场景四、ChatGPT未来展望五、OpenAI介绍前言 3月3号&#xff0c;早上6:30就有人发消息给我&#xff0c;来问我有关GPT API的事件。 那是因为3月2号&#xff0c;OpenAI 发布了ChatGPT 3.5的开放…...

深入理解Zookeeper的ZAB协议

ZAB是什么ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;&#xff1a;Zookeeper原子广播ZAB是为了保证Zookeeper数据一致性而产生的算法&#xff08;指的是Zookeeper集群模式&#xff09;。它不仅能解决正常情况下的数据一致性问题&#xff0c;还可以保证主节点发生宕…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...