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

成都旧房改造装修公司哪家好/seo产品优化免费软件

成都旧房改造装修公司哪家好,seo产品优化免费软件,长沙建网站速成班,关于拳馆网站建设计划书JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 定义函数 定义函数有两种方式:函数声明和函数表达式大致看这两种方式没有什么区别,事实上,JavaScript 引擎在加载数据时对它们是区别对待的。JavaScript 引擎在任何代…

JavaScript高级程序设计(第4版)读书分享笔记记录

适用于刚入门前端的同志

定义函数

定义函数有两种方式:函数声明和函数表达式
        大致看这两种方式没有什么区别,事实上,JavaScript 引擎在加载数据时对它们是区别对待的。JavaScript 引擎在任何代码执行之前,会先读取函数声明并在执行上下文中生成函数定义而函数表达式必须等到代码执行到它那一行,才会在执行上下文中生成函数定义

函数声明式

栗子:

function sum (num1, num2) { return num1 + num2; 
}

 函数提升

栗子:

console.log(sum(10, 10)); //20
function sum(num1, num2) { return num1 + num2; 
}
        以上代码可以正常运行,因为函数声明会在任何代码执行之前先被读取并添加到执行上下文(函数声明提升)。
执行原理:
        在执行代码时,JavaScript 引擎会先执行一遍扫描, 把发现的函数声明提升到源代码树的顶部。因此即使函数定义出现在调用它们的代码之后,引擎也会把函数声明提升到顶部
注意:如果把前面代码中的函数声明改为等价的函数表达式,那么执行的时候就会出错。
栗子:
// 会出错
console.log(sum(10, 10)); // // Error! function doesn't exist yet
let sum = function(num1, num2) { return num1 + num2; 
};

函数表达式

        函数表达式看起来就像一个普通的变量定义和赋值,即创建一个函数再把它赋值给一个变量.
这样创建的函数叫作匿名函数anonymous funtion),因为 function 关键字后面没有标识符

栗子:

let functionName = function(arg0, arg1, arg2) { // 函数体 
};
// or
let functionName;
functionName = function(arg0, arg1, arg2) { // 函数体 
};

箭头函数

ECMAScript 6 新增了使用胖箭头(=>)语法定义函数表达式的能力。
        很大程度上,箭头函数实例 化的函数对象与正式的函数表达式创建的函数对象行为是相同的。任何可以使用函数表达式的地方,都可以使用箭头函数
栗子:
let arrowSum = (a, b) => { return a + b; 
};
console.log(arrowSum(5, 8)); // 13
        如果只有一个参数,那也可以不用括号。只有没有参数,或者多个参数的情况下,才需要使用括号。
注意:
        箭头函数虽然语法简洁,但也有很多场合不适用。箭头函数不能使用 argumentssuper
new.target,也不能用作构造函数。此外,箭头函数也没有 prototype 属性。

理解参数

读取函数参数可以用到命名参数arguments对象。

     arguments 对象是一个类数组对象,因此可以使用中括号语法访问其中的 元素(第一个参数是 arguments[0])。而要确定传进来多少个参数,可以访问arguments.length 属性。

栗子:
function sayHi(name, message) { console.log("Hello " + name + ", " + message); console.log(arguments.length);
}//等价于function sayHi() { console.log("Hello " + arguments[0] + ", " + arguments[1]); console.log(arguments.length);
}sayHi('Tom','welcome To My CSDN'); // 2
还有一个必须理解的重要方面,那就是 arguments 对象可以跟命名参数一起使用。
栗子:
function doAdd(num1, num2) { if (arguments.length === 1) { console.log(num1 + 10); } else if (arguments.length === 2) { console.log(arguments[0] + num2); } 
}

arguments

        arguments 对象其实还有一个 callee 属性是一个指向 arguments 对象所在函数的指针
使用 arguments.callee 就可以让函数逻辑与函数名解耦
使用栗子:
function factorial(num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } 
}//等价于
function factorial(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num - 1); //arguments.callee代表factorial} 
}

箭头函数中的参数

        上面提到过箭头函数,如果函数是使用箭头语法定义的,那么传给函数的参数将不能使用 arguments 关键字访问,而只能通过定义的命名参数访问。

默认参数值

ECMAScript 6 支持显式定义默认参数了。

栗子:

function makeKing(name = 'Henry') { return `King ${name} VIII`; 
} 
console.log(makeKing('Louis')); // 'King Louis VIII' 
console.log(makeKing()); // 'King Henry VIII'//箭头函数也可let makeKing = (name = 'Henry') => `King ${name}`; 
console.log(makeKing()); // King Henry

扩展参数

ECMAScript 6 中,可以通过扩展操作符极为简洁地实现参数扩展。
   因为数组的长度已知,所以在使用扩展操作符传参的时候,并不妨碍在其前面或后面再传其他的值, 包括使用扩展操作符传其他参数(普通传参可以和扩展传参一起使用)
栗子:
let values = [1, 2, 3, 4]; 
function getSum() { let sum = 0; for (let i = 0; i < arguments.length; ++i) { sum += arguments[i]; } return sum; 
}console.log(getSum(...values)); // 10//等价于  getSum(1,2,3,4)console.log(getSum(-1, ...values)); // 9 
//等价于  getSum(-1,1,2,3,4)
console.log(getSum(...values, 5)); // 15 
console.log(getSum(-1, ...values, 5)); // 14 
console.log(getSum(...values, ...[5,6,7])); // 28
//等价于  getSum(1,2,3,4,5,6,7)

   函数内部

this

  •  this,它在标准函数和箭头函数中有不同的行为。(重点)
  •  在标准函数中,this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 this 值(在网页的全局上下文中调用函数时,this 指向 windows)(谁调用这个函数,this就指向谁)。
  •  这个 this 到底引用哪个对象必须到函数被调用时才能确定
栗子:
window.color = 'red'; 
let o = { color: 'blue' 
}; 
function sayColor() { console.log(this.color); 
} 
sayColor(); // 'red' 
o.sayColor = sayColor; 
o.sayColor(); // 'blue'
  • 在箭头函数中,this引用的是定义箭头函数的上下文。(箭头函数在哪里定义的,this就指向谁)

栗子:

this 引用的都是 window 对象,因为这个箭头函数是在 window 上下文中定义的。
window.color = 'red'; 
let o = { color: 'blue' 
}; 
let sayColor = () => console.log(this.color); 
sayColor(); // 'red' 
o.sayColor = sayColor; 
o.sayColor(); // 'red'

caller

ECMAScript 5 也会给函数对象上添加一个属性:caller。这个属性引用的是调用当前函数的函数
栗子:
function outer() { inner(); 
} 
function inner() { console.log(inner.caller); 
} 
outer();
//前面有说过 arguments.callee 是指向arguments所在的函数,所以可以改为
function outer() { inner(); 
} 
function inner() { console.log(arguments.calle.caller); 
} 
outer();

打印结果:

 函数属性与方法

属性

        前面提到过,ECMAScript 中的函数是对象,因此有属性和方法。每个函数都有两个属性:length和 prototype
        length 属性保存函数定义的命名参数的个数
栗子:
function sayName(name) { console.log(name); 
} 
function sum(num1, num2) { return num1 + num2; 
} 
function sayHi() { console.log("hi"); 
} 
console.log(sayName.length); // 1 
console.log(sum.length); // 2 
console.log(sayHi.length); // 0

方法

  • 函数还有两个方法:apply()call()
  • 这两个方法都会以指定的 this 值来调用函数,即会设置调用函数时函数体内 this 对象的值。
  • apply()call()真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内 this
    值的能力。
apply()方法接收两个参数:函数内 this 的值和一个参数数组
栗子:
window.color = 'red'; 
let o = { color: 'blue' 
}; 
function sayColor(a,b,c) { console.log(this.color,a,b,c); 
} 
sayColor(1,2,3); // red,1,2,3
sayColor.apply(this,[2,3,4]); // red,2,3,4
sayColor.apply(window,[2,3,4]); // red ,2,3,4
sayColor.apply(o,[2,3,4]); // blue,2,3,4

call()方法:第一个参数函数内 this 的值,而剩下的要传给被调用函数的参数则是逐个传递的。

栗子:

window.color = 'red'; 
let o = { color: 'blue' 
}; 
function sayColor(a,b,c) { console.log(this.color,a,b,c); 
} 
sayColor(1,2,3); // red,1,2,3
sayColor.call(this,2,3,4); // red,2,3,4
sayColor.call(window,2,3,4); // red ,2,3,4
//而在使用 sayColor.call(o)把函数的执行上下文即 this 切换为对象 o 之后,结果就变成了示"blue"了。
sayColor.call(o,2,3,4)// bule,2,3,4

总结:

1. 区别

  • call传递的参数是序列1,2,3
  • apply传递的参数是集合型[1,2,3]

2. 相同点

  • call和apply是替换前面函数内部的this指针以及传递参数。
  • 功能:可以自动执行前面的函数
  • 都有两个参数:a. 替换的对象 b. 传递的值

bind()

        ECMAScript 5 出于同样的目的定义了一个新方法:bind()bind()方法会创建一个新的函数实例, 其 this 值会被绑定到传给 bind()的对象。
栗子:
window.color = 'red'; 
var o = { color: 'blue' 
}; 
function sayColor() { console.log(this.color); 
} 
let objectSayColor = sayColor.bind(o); 
objectSayColor(); // blue

相关文章:

JavaScript高级程序设计读书分享之10章——函数

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 定义函数 定义函数有两种方式&#xff1a;函数声明和函数表达式大致看这两种方式没有什么区别&#xff0c;事实上&#xff0c;JavaScript 引擎在加载数据时对它们是区别对待的。JavaScript 引擎在任何代…...

第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项

文章目录第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项设计注意事项第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项 IRIS 可以在特定事件发生时执行自定义代码。需要两个步骤&#xff1a; 定义 ^%ZSTART 例程、^%ZSTO…...

工作实战之拦截器模式

目录 前言 一、结构中包含的角色 二、拦截器使用 1.拦截器角色 a.自定义拦截器UserValidateInterceptor&#xff0c;UserUpdateInterceptor&#xff0c;UserEditNameInterceptor b.拦截器配置者UserInterceptorChainConfigure&#xff0c;任意组装拦截器顺序 c.拦截器管理者…...

某美颜app sig参数分析

之前转载过该app的文章&#xff0c;今天翻版重新整理下&#xff0c;版本号:576O5Zu56eA56eAYXBwIHY5MDgw (base64 解码)。 上来先抓个包&#xff1a; jadx搜索关键词 "sigTime"&#xff0c;然后定位到这里 看这行代码 cVar.addForm(INoCaptchaComponent.sig, genera…...

Linux - Linux系统优化思路

文章目录影响Linux性能的因素CPU内存磁盘I/O性能网络宽带操作系统相关资源系统安装优化内核参数优化文件系统优化应用程序软件资源系统性能分析工具vmstat命令iostat命令sar命令系统性能分析标准小结影响Linux性能的因素 CPU CPU是操作系统稳定运行的根本&#xff0c;CPU的速…...

2.Elasticsearch入门

2.Elasticsearch入门[toc]1.Elasticsearch简介Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。客户端支持Java、.NET&#xff08;C#&#xff09;、PHP、Pyth…...

RK3399平台开发系列讲解(应用开发篇)断言的使用

🚀返回专栏总目录 文章目录 一、什么是断言二、静态断言三、运行时断言沉淀、分享、成长,让自己和他人都能有所收获!😄 📢断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供。 一、什么是断言 在编程中…...

云原生系列之使用prometheus监控nginx

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文主要讲解云原生系列之使用prometheus监控nginx 文章收录到 csdn 我是沐风晓月的博客【prometheus监控系列】专栏&#xff0c;此专栏是沐风晓月对云原生prometheus的的总结&#xff0c;希望能够加深自…...

第六届省赛——8移动距离(总结规律)

题目&#xff1a;X星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。比如&#xff1a;当小区排号宽度为6时&#xff0c;开始情形如下&#xff1a;1 2 3 4 5 612 11 10 9 8 713 14 1…...

C++vector 简单实现

一。概述 vector是我们经常用的一个容器&#xff0c;其本质是一个线性数组。通过对动态内存的管理&#xff0c;增删改查数据&#xff0c;达到方便使用的目的。 作为一个线性表&#xff0c;控制元素个数&#xff0c;容量&#xff0c;开始位置的指针分别是&#xff1a; start …...

通用缓存存储设计实践

目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…...

sheng的学习笔记Eureka Ribbon

Eureka-注册中心Eureka简介官方网址&#xff1a;https://spring.io/projects/spring-cloud-netflixEureka介绍Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。Zooleeper nacos.Eureka 采用了 C-S 的设计架构。Eureka Server 作为服…...

零代码工具我推荐Oracle APEX

云原生时代零代码工具我推荐Oracle APEX 国内的低码开发平台我也看了很多&#xff0c;感觉还是不太适合我这个被WEB抛弃的老炮。自从看了Oracle APEX就不打算看其它的了。太强大了&#xff0c;WEB服务器都省了&#xff0c;直接数据库到WEB页面。功能很强大&#xff0c;震撼到我…...

InstructGPT方法简读

InstructGPT方法简读 引言 仅仅通过增大模型规模和数据规模来训练更大的模型并不能使得大模型更好地理解用户意图。由于数据的噪声极大&#xff0c;并且现在的大多数大型语言模型均为基于深度学习的“黑箱模型”&#xff0c;几乎不具有可解释性和可控性&#xff0c;因此&…...

SpringCloud-5_模块集群化

避免一台Server挂掉&#xff0c;影响整个服务&#xff0c;搭建server集群创建e-commerce-eureka-server-9002微服务模块【作为注册中心】创建步骤参考e-commerce-eureka-server-9001修改pom.xml,加入依赖同9001创建resources/application.yml9002的ymlserver: # 修改端口号por…...

AQS底层源码深度剖析-BlockingQueue

目录 AQS底层源码深度剖析-BlockingQueue BlockingQueue定义 队列类型 队列数据结构 ArrayBlockingQueue LinkedBlockingQueue DelayQueue BlockingQueue API 添加元素 检索(取出)元素 BlockingQueue应用队列总览图 AQS底层源码深度剖析-BlockingQueue【重点中的重…...

Kotlin协程:Flow的异常处理

示例代码如下&#xff1a;launch(Dispatchers.Main) {// 第一部分flow {emit(1)throw NullPointerException("e")}.catch {Log.d("liduo", "onCreate1: $it")}.collect {Log.d("liudo", "onCreate2: $it")}// 第二部分flow …...

qt下ffmpeg录制mp4经验分享,支持音视频(h264、h265,AAC,G711 aLaw, G711muLaw)

前言 MP4&#xff0c;是最常见的国际通用格式&#xff0c;在常见的播放软件中都可以使用和播放&#xff0c;磁盘空间占地小&#xff0c;画质一般清晰&#xff0c;它本身是支持h264、AAC的编码格式&#xff0c;对于其他编码的话&#xff0c;需要进行额外处理。本文提供了ffmpeg录…...

C#读取Excel解析入门-1仅围绕三个主要的为阵地,进行重点解析,就是最理性的应对上法所在

业务中也是同样的功能点实现。只是多扩展了很多代码&#xff0c;构成了项目的其他部分&#xff0c;枝干所在。但是有用的枝干&#xff0c;仅仅不超过三个主要的&#xff01;所以您仅仅围绕三个主要的为阵地&#xff0c;进行重点解析&#xff0c;就是最理性的应对上法所在了 str…...

一起Talk Android吧(第五百一十八回:在Android中使用MQTT通信五)

文章目录 知识回顾问题描述解决过程经验分享各位看官们大家好,这一回中咱们说的例子是" 在Android中使用MQTT通信五",本章回内容与前后章节内容无关联。闲话休提,言归正转,让我们一起Talk Android吧! 知识回顾 我们在前面章回中介绍了如何使用MQTT通信,包含它…...

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性&#xff0c;我们习惯于我们的日常世界&#xff0c;它以线性方式运作&#xff0c;没有不连续或突跳。 为此&#xff0c;我们学会了期望各种过程以连续方式运行&#xff0c;我们的内心为了让我们更有安全感&#xff0c;把很多事物的结果归于秩序&#xff0c…...

Java开发 - Redis初体验

前言 es我们已经在前文中有所了解&#xff0c;和es有相似功能的是Redis&#xff0c;他们都不是纯粹的数据库。两者使用场景也是存在一定的差异的&#xff0c;本文目的并不重点说明他们之间的差异&#xff0c;但会简要说明&#xff0c;重点还是在对Redis的了解和学习上。学完本…...

Python - 使用 pymysql 操作 MySQL 详解

目录创建连接 pymsql.connect() 方法的可传参数连接对象 conn pymsql.connect() 方法游标对象 cursor() 方法使用示例创建数据库表插入数据操作数据查询操作数据更新操作数据删除操作SQL中使用变量封装使用简单使用&#xff1a; import pymysqldb pymysql.connect(host,user…...

机器学习-卷积神经网络CNN中的单通道和多通道图片差异

背景 最近在使用CNN的场景中&#xff0c;既有单通道的图片输入需求&#xff0c;也有多通道的图片输入需求&#xff0c;因此又整理回顾了一下单通道或者多通道卷积的差别&#xff0c;这里记录一下探索过程。 结论 直接给出结论&#xff0c;单通道图片和多通道图片在经历了第一…...

考研复试——计算机组成原理

文章目录计算机组成原理1. 计算机系统由哪两部分组成&#xff1f;计算机系统性能取决于什么&#xff1f;2. 冯诺依曼机的主要特点&#xff1f;3. 主存储器由什么组成&#xff0c;各部分有什么作用&#xff1f;4. 什么是存储单元、存储字、存储字长、存储体&#xff1f;5. 计算机…...

硬件设计 之摄像头分类(IR摄像头、mono摄像头、RGB摄像头、RGB-D摄像头、鱼眼摄像头)

总结一下在机器人上常用的几种摄像头&#xff0c;最近在组装机器人时&#xff0c;傻傻分不清摄像头的种类。由于本人知识有限&#xff0c;以下资料都是在网上搜索而来&#xff0c;按照摄像头的分类整理一下&#xff0c;供大家参考&#xff1a; 1.IR摄像头&#xff1a; IRinfr…...

PTA:C课程设计(2)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;2&#xff09;2-5-1 字符定位函数&#xff08;程序填空题&#xff09;2-5-2 判断回文&#xff08;程序填空题&#xff09;2-6-1 数字金字塔(函数)2-6-2 使用函数求最大公约数(函数)2-6-3 使用函数求余弦函…...

第四章:面向对象编程

第四章&#xff1a;面向对象编程 4.1&#xff1a;面向过程与面向对象 面向过程(POP)与面向对象(OOP) 二者都是一种思想&#xff0c;面向对象是相对于面向过程而言的。面向过程&#xff0c;强调的是功能行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。面向对象&…...

Linux 安装npm yarn pnpm 命令

下载安装包 node 下载地址解压压缩包 tar -Jxf node-v19.7.0-linux-x64.tar.xz -C /root/app echo "export PATH$PATH:/app/node-v16.9.0-linux-x64" >> /etc/profile source /etc/profile ln -sf /app/node-v16.9.0-linux-x64/bin/npm /usr/local/bin/ ln -…...

linux SPI驱动代码追踪

一、Linux SPI 框架概述 linux系统下的spi驱动程序从逻辑上可以分为3个部分: SPI Core&#xff1a;SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分&#xff0c;SPI Core 提供操作接口&#xff0c;允许一个 spi master&#xff0c;spi driver 和 spi device 在 SPI Cor…...