javascript 面向对象精要 第二章 函数

JavaScript编程精要:掌握循环、函数与面向对象 本文深入探讨了JavaScript编程中至关重要的概念,包括字符串中数字的处理、循环的多种类型、函数声明与调用、面向对象编程的高级特性,以及DOM与BOM的操作。通过对这些核心章节的解读,我们能够更好地理解JavaScript的复杂性与灵活性。 阅读详情
第二章 函数

引言:函数就是对象。函数不同于其他对象的决定性特点是函数存在一个被称为[[call]]的内部属性。内部属性无法通过代码访问而是定义了代码执行时的行为。[[call]]属性是函数独有的,表明该对象可以被执行。理解函数的行为是理解javascript 的核心。

2.1 声明还是表达式

函数有两种字面形式。第一种:函数声明

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

第二种:函数表达式(这种函数被称为匿名函数)

var add=function(num1,num2){
      return num1+num2;
};
两种形式的区别:函数声明会被提升至上下文。这意味着你可以先使用函数后声明它们。

原因:函数声明会被提升,这是因为引擎提前知道了函数的名字。函数表达式只能通过变量引用,因此无法提升。

2.2 函数就是值

可以像使用对象一样使用函数,也可以将他们赋给变量,在对象中添加他们,将他们当成参数传给别的函数,或从别的函数中返回。

function sayHi(){
    console.log("hi");
}
sayHi();       //outputs "hi"
var sayHi2=sayHi;
sayHi2();      //outputs "hi"

这段代码首先有一个函数声明。然后有一个变量sayHi2被创建,并且被赋予sayHi的值。sayHi和sayHi2现在指向同一个函数。两者都可以执行,并且具有相同结果。

只要你记住函数就是对象,很多行为就变得容易理解了。

例如,你可以将函数当成参数传递给其他的参数。javascript的数组的sort()方法,接受一个比较函数作为可选参数。每当数组中有两个值需要进行比较时都会调用比较函数。如果第一个值小于第二个,比较值返回负数。如果第一个值大于第二个,比较值返回正数。如果相等,返回0。

在默认情况下,sort将数组中每个对象转换为字符串,然后进行比较。这意味着你无法在不指定比较函数的情况下为数字的数组精确排序。例子如下:

var numbers=[1,5,8,4,7,10,2,6];
number.sort(function(first,second){
       return first-second;
});
console.log(numbers);     //"[1,2,4,5,6,78,10]"
number.sort();
console.log(numbers);     //"[1,10,2,4,5,6,7,8]"
在本例中,被传给sort()的比较函数其实是一个函数表达式。第二次输出结果是因为默认的sort函数将所有值都转换为字符串进行比较。

2.3 参数

可以给javascript 函数传递任意数量的参数而不造成错误。那是因为函数参数实际上被保存在一个被称为arguments的类似数组的对象中。arguments可以自由增长来包含任意个数的值,这些值可以通过数字索引来引用。arguments的length属性可以告诉你目前有多少个值。arguments对象自动存在于函数中。

下面是一个简单的使用arguments和函数的期望参数个数的例子。实际传入的参数的数量不影响函数的期望参数个数。

function reflect(value){
     return value;
}
console.log(reflect("hi")); //"hi"
console.log(reflect("hi",25)); //"hi"
console.log(reflect.length); //1
reflect=functio(){
     return arguments[0];
}
console.log(reflect("hi")); //"hi"
console.log(reflect("hi",25)); //"hi"
console.log(reflect.length); //0

本例中先定义了一个具有单一命名参数的reflect()函数,但是两个参数传递给它时并,没有任何错误。由于只有一个命名参数,所以length属性为1。之后重新定义reflect()为无命名参数的函数,它返回传入的第一个参数arguments[0]。但它的length为0。

假设你想创建一个函数接受任意数量的参数并返回他们的和。因为你不知道有多少个参数,所以无法使用命名函数,在这种情况下,使用arguments最好。举例如下:

function sum(){
     var result =0,
     i=0,
     len=arguments.length;
     while(i<len){
       result+=arguments[i];
        i++;
      }
      return result;
}
console.log(sum(1,2)); //3
console.log(sum(50)); //50
console.log(sum()); //0

sum()函数接收任意数量的参数,并在while循环中遍历他们的值来求和。由于result的初始值为0,该函数就算没有参数,也可以正常工作。

2.4 重载

javascript 函数可以接受任意数量的参数且参数类型完全没有限制,javascript 函数不存在重载。

function say(message){
      console.log(message);
}
function say(){
      console.log("default");
}
say("hello");      //"default"

在javascript里,当你试图定义多个重名的函数时,只有最后的定义有效,之前的函数声明被完全删除。

function say(message){
     if (arguments.length===0){
         message="default";
     }
     console.log(message);
}
say("hello");    //hello

本例中,say()函数的行为视传入参数的个数而定。

2.5 对象方法

在下面代码中,变量person被赋予了一个对象的字面形式,包含属性和方法sayname.

var person={
  name:"hui",
  sayName:function(){
    console.log(person.name);
   }
};
person.sayName();  //"hui"

2.5.1 this 对象

sayName()方法直接引用了person.name在方法和对象之间建立了紧耦合。上例中应该改person.name为this.name。

javascript所有的函数作用域内都有一个this对象代表调用函数的对象。在全局作用域,this代表全局对象(浏览器里的window)。当一个函数作为对象的方法被调用时,默认this的值等于那个对象。

function sayNameForAll(){
     console.log(this.name);
}
var person1={
      name:"hui",
      sayName: sayNameForAll
};
var person2={
      name:"xia",
      sayName: sayNameForAll
};
var name="mm";
person1.sayName();
person2.sayName();
sayNameForAll();

运行结果如下:

本例中先定义函数,sayNameForAll.然后以字面形式创建两个对象以sayNameForAll函数作为sayName方法。当person1调用sayName时,输出“hui".当person2调用sayName时,输出“xia".最后定义了全局变量name.,所以当直接调用sayNameForAll是输出是"mm".

2.5.2 改变this

记住函数是对象,而对象有方法,所以函数也有。

(1)call()方法

它以指定的this值和参数来执行函数。call()的第一个参数指定了函数执行时的this值,其后所有的参数都是需要被传入函数的参数。

function sayNameForAll(label){
       console.log(label+":"+this.name);
}
var person1={
       name:"hui"
};
var person2={
       name:"xia"
};
var name="mm";
sayNameForAll.call(this,"global");
sayNameForAll.call(person1,"person1");
sayNameForAll.call(person2,"person2");

运行结果如下:

由于使用了call()方法,你不需要将函数加入每个对象。因为你显式指定了this值而不是让javascript引擎自动指定。

(2)apply()方法

apply()的工作方式和call()方法完全一样,但它只接受两个参数,this值和一个数组或者类似数组的对象,内含需要被传入函数的参数(也就是说你可以把arguments对象作为apply()的第二个参数)。

function sayNameForAll(label){
       console.log(label+":"+this.name);
}
var person1={
       name:"hui"
};
var person2={
       name:"xia"
};
var name="mm";
sayNameForAll.call(this,["global"]);
sayNameForAll.call(person1,["person1"]);
sayNameForAll.call(person2,["person2"]);

运行结果和上例一样。

(3)bind()方法

ECMAScript5中新增的这个方法。bind()方法的第一个参数为this对象的值,第二个参数可选,可以不写,也可以写传入函数的参数值。

下面例子演示了使用bind的例子。创建了sayNameForPerson1()函数,并将person1绑定为其this对象的值。然后创建了sayNameForPerson2()函数,并将person2绑定为其this对象的值,person2绑定为其第一个参数。

function sayNameForAll(label){
       console.log(label+":"+this.name);
}
var person1={
       name:"hui"
};
var person2={
       name:"xia"
};
var sayNameForperson1=sayNameForAll.bind(person1);
sayNameForperson1("person1");

var sayNameForperson2=sayNameForAll.bind(person2,"person2");
sayNameForperson2();

person2.sayName=sayNameForperson1;
person2.sayName("person2");

sayNameForPerson1()函数没有绑定参数,所以你仍需传入lable参数用于输出。sayNameForPerson2()函数不仅绑定this为person2,同时也绑定了第一个参数为"person2".这意味着你可以调用sayNameForPerson2()函数而不传入任何额外参数。

运行结果如下:


例子最后将sayNameForPerson1()设置为person2的sayName方法。由于其this值已经绑定,所以虽然sayNameForPerson1()现在是person2 的方法。它仍然输出person1.name的值。

完  等待第三章更新哦吐舌头

JavaScript面向对象 适合于JavaScript初学者 立即下载

相关推荐

面向对象JavaScript精要(英文原版pdf)

面向对象JavaScript 精要(英文原版pdf)

JavaScript 表单、对象、函数(二十一)

JavaScript表单 javaScript 表单验证 HTML 表单验证可以通过 JavaScript 来完成。 数据验证 典型的数据验证有: 必需字段是否有输入? 用户是否输入了合法的数据? 在数字字段是否输入了文本? HTML 约束验证 HTML 输入属性 CSS 伪类选择器 DOM 属性和方法 约束验证 HTML 输入属性 disabled 规定输入的元素不可用 max 规定输入元素的最大值 min 规定输入元素的最小值 pattern 规定输入元素值的模式 required 规定输入元素字段是必

优快云凉宸 486

基于STM32H750的便携式双通道示波器与信号发生器AFE设计

示波器和信号发生器是电子测量与嵌入式系统调试的基础仪器,其核心在于模拟前端(AFE)对宽动态范围、高精度采样与低失真输出的协同实现。原理上需兼顾输入信号调理(衰减/放大/偏置)、ADC/DAC接口匹配、触发同步及电源完整性设计。技术价值体现在以低成本器件达成±15V输入/±10V输出、16位等效采样精度与85kHz带宽的工程平衡。典型应用场景包括电机驱动波形观测、传感器信号验证、电源环路测试及通信电平分析。本方案聚焦STM32H750平台,深度融合硬件拓扑与片上资源特性,为嵌入式教学与原型开发提供可复现、易

weixin_35755188的博客 110

Java 构造函数的详解

我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢? 1.构造方法的作用: 构造方法作用:对对象进行初始化. 如图: 2.构造函数与普通函数的区别: (1). 一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初

重心开始,重新开始 18万+

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

syqenter的专栏 8962

QCC308X/518X/309X加LDAC解码

QCC308X/518X/309X加LDAC解码。

Alex_886的博客 6610

javascript面向对象精要学习总结(第二章 函数)

函数也是对象,但一点不同 函数存在一个 call 的内部属性,表明函数可执行 typeof 对任何具有call属性的对象,都返回“function” function fun(){ console.log(typeof fun.call); } fun() 函数的参数 函数的length属性,即为参数的个数 函数中,arguments.length,也表示参数的个数 js中函数没有重...

龙旗飘扬的舰队 257

LLM推理服务中的SLO感知调度优化实践

在AI服务架构中,服务级别目标(SLO)是衡量服务质量的核心指标,特别是在大型语言模型(LLM)推理场景下。SLO通常涉及TTFT(首token时间)、TPOT(每token生成时间)和端到端延迟等关键维度,这些指标直接影响用户体验和系统效率。传统FCFS调度策略由于缺乏SLO感知能力,在混合负载下往往导致资源利用率低下和SLO达标率骤降。通过引入基于模拟退火的动态调度算法和精准的延迟预测模型,可以实现对不同优先级请求的智能调度,显著提升GPU利用率和SLO达标率。这种技术方案特别适用于需要同时处理实时对话

weixin_42549154的博客 372

javascript面向对象精要第二章函数整理精要

转载于:https://www.cnblogs.com/smart-girl/p/9313247.html

weixin_30845171的博客 103

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析

本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。

weixin_29070861的博客 480

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1517

《JavaScript 面向对象精要》第 2 章 函数

第 2 章 函数 《JavaScript 面向对象精要》—— Nicholas C. Zakas 如第 1 章所述,函数实际上是 JavaScript 中的对象。 函数的定义特征 - 它与任何其他对象的区别 - 是存在名为 [[Call]] 的内部属性。 内部属性不能通过代码访问,而是定义在执行代码时的行为。 ECMAScript 为 JavaScript 中的对象定义了多个内部属性,这些内部属性由双方括号表示法指示。 [[Call]] 属性表示该对象可执行。 只有函数具有 [[Call]] 属性,因此

吴钦飞 322

ROS机器人全覆盖路径规划实战:6种ipa算法对比与选型指南(附避坑经验)

本文深入对比了ROS中ipa_coverage_planning功能包集成的6种全覆盖路径规划算法,包括牛耕分解、栅格旅行商、神经网络、局部能量最小、轮廓线和凸感知放置。文章从覆盖率、重复率、计算效率、动态避障等核心工程指标出发,提供了基于不同场景(如静态/动态环境、规则/复杂布局)的实战选型指南,并分享了神经网络和局部能量最小等关键算法的参数调优与避坑经验,旨在帮助开发者根据实际需求选择并优化最合适的ipa覆盖算法。

perl8的博客 364

JavaScript面向对象精要

JavaScript面向对象精要JavaScript面向对象精要1.原始类型和引用类型1.1 什么是类型1.2 原始类型鉴别原始类型原始方法1.3 引用类型创建对象对象引用解除添加删除属性1.4 内建类型实例化字面形式1.5 访问属性1.6 鉴别引用类型1.8 原始封装类型1.9 总结2. 函数2.1 声明还是表达式2.2 函数就是值2.3 参数2.4 重载2.5 对象方法2.5.1 this 对象2.5.2 改变 this2.6 总结3.理解对象3.1 定义属性3.2 属性探测3.3 删除属性3.4 属性

前端博客典中典 747

手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手

通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。

小蜗牛的珍贵百宝箱 4806

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《JavaScript 面向对象精要》 读书笔记

《JavaScript 面向对象精要》 读书笔记 高程面向对象这块内容介绍的比较浅显,个人觉得这本小书是高程的补充,看完之后觉得收获匪浅,所以做了个笔记,以备后询 1. 原始类型和引用类型 Js中两种基本数据类型:原始类型(基本数据类型)和引用类型;原始类型保存为简单数据值,引用类型则保存为对象,其本质是指向内存位置的应用。 其它编程语言用栈存储原始类型,用堆存储引用类型,而js则不同:它...

Lee的博客 606

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《JavaScript 面向对象精要》 - 介绍

《JavaScript 面向对象精要》 - 介绍 《JavaScript 面向对象精要》—— Nicholas C. Zakas 关于面向对象编程,大多数开发者会联想到学校教的基于类的面向对象语言,如 Java、C++。 在这些语言里,无论做什么事,都要先创建一个类。 行业中常见的设计模式也在加强基于类的概念的使用。 但是,JavaScript 不使用类,这也是为什么人们在学完 Java 或 C++ 后再去学 JavaScript,会感到困惑。 面向对象语言具有几个特性: 封装:数据、操作数据的功能组

吴钦飞 325

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

js 面向对象精要——继承

js 面向对象精要——继承 文章目录js 面向对象精要——继承原型对象链和 Object.protytype继承自 Object.prototype 的方法对象继承构造函数继承构造函数窃取 2019-6-9 原型对象链和 Object.protytype 继承 在面向对象语言中,子类从父类中继承父类的属性和方法,叫继承 JavaScript内置的继承方法被称为原型对象链。 原型对象链:对象继承...

逆水行舟,不进则退 1199

【读书笔记】JavaScript面向对象精要(上)

写在前面 本文章为对书《JavaScript面向对象精要》的读后总结。在阅读本文章前,我们先来整理一份思维导图,帮助我们快速浏览本文大概内容 第一章 原始类型和引用类型 1.1 类型的定义 在JavaScript中,存在两种类型 原始类型(保存为简单数据值) 引用类型(保存为对象,本质是指向内存位置的引用) 1.2 原始类型 1.2.1 关于原始类型的简介 在JavaScript中,共有...

Alberqing_的博客 307

JS面向对象精要

JS面向对象精要 面向对象语言特性:封装、聚合、继承、多态 一、原始类型和引用类型 原始类型(数字、字符串、布尔值、数组、空、未定义):非对象,但拥有方法 ·字面形式:不被保存在变量中的量,给原始类型赋值,二者并没有直接关联,因为其存储的地址不同 引用类型(对象) ·赋值实际上是给变量一个指针,指向内存中的同一个对象 内建类型实例化 JS中没有类,但有类似类的实例 如:Array数组 Date时间 Function函数-匿名函数-闭包 RegExp正则表达式 原始封装类型 实质:给其添加属性成为临时对象 e

yikina_tiyoko的博客 226

【JS高级进阶】JavaScript初识面向对象

本篇主要讲解了什么是面向对象,如何创建使用类,super关键字的使用以及注意事项(学过Java的小伙伴们就会很容易理解)区分面向对象和面向过程

zhaochen1127的博客 2700

《Javascript面向对象精要》笔记

刚读过《Javascript面向对象精要》这本书,在现有的知识体系里面有一些新鲜的认识,记录一下。 原始类型和引用类型 Javascript存在两种类型:原始类型和引用类型。原始类型包括String、Number、Boolean、Null、Undefined,引用类型保存对象,其本质是对象所在内存位置的引用。 原始类型的赋值或者给函数传参,实际上都是传递原始类型值的拷贝;...

176

《JavaScript面向对象精要》 读书笔记

《JavaScript面向对象精要》这本书是基于ES5讲解的JavaScript中面向对象的核心知识。 JavaScript中的面向对象不同于c++,java等语言,JavaScript以一种非常灵活的方式实现面向对象。

weixin_49374896的博客 273

Java2精要_JavaScript面向对象精要

原标题:JavaScript面向对象精要来自:淡忘~浅思.链接:http://www.ido321.com/1585.html 和 http://www.ido321.com/1586.html数据类型在Java中,数据类型分为两类:原始类型:保存一些简单数据,如true,5等。Java共有5中原始类型:●boolean:布尔,值为true或false●number:数字,值为任何整型会浮点数值●...

weixin_39795284的博客 143

js面向对象精要——构造函数和原型对象

js面向对象精要——构造函数和原型对象 文章目录js面向对象精要——构造函数和原型对象构造函数什么是构造函数instanceof原型对象[[Prototype]] 属性在构造函数中使用原型对象内建对象的原型对象 2019-6-8 构造函数 什么是构造函数 通过 new 关键字创建对象时调用的函数 一般首字母大写 构造函数允许使用一致的方式初始化实例 // 定义方式一 function Pers...

逆水行舟,不进则退 560
上一篇: javascript 面向对象精要 第一章 原始类型和引用类型
下一篇: javascript 面向对象精要 第三章 理解对象
flying_huixia
博客等级 码龄9年 76粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值