JavaScript快速入门之函数
引言
总所周知,JavaScript是一个很随便的语言,因此,在学习它的语法的时候,我是和Java语法对比着学的,可能会有些绕
函数
方法:对象(属性,方法)
函数:放在对象外面的方法
定义函数
定义方式一
绝对值函数
function abs(x){if(x>=0){return x;}else{return -x;}}
一旦执行到return代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是undefined(未定义)
定义方式二
var abs = function(x){if(x>=0){return x;}else{return -x;}}//类似于匿名内部类
function(x){...} 这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!
方法一和方法二等效
调用函数
abs(10)
参数问题:JavaScript 可以传任意个参数,也可以不传递参数
参数传进来是否存在的问题?假设不存在参数,如何规避
var abs = function(x){//手动抛出异常if (typeof x !=="number"){throw new Error("abs()参数类型错误");}if(x>=0){return x;}else{return -x;}}
arguments
arguments是一个JS免费赠送的关键字 代表传递进来的所有参数为数组
作用:利用arguments可以拿到所有的参数,比如:如果函数中只有一个参数,如果传入第二个参数,我们可以通过arguments来拿到第二个参数进行使用
var abs = function(x){console.log("x=>"+x);for (var i=0;i<arguments.length;i++){console.log(arguments[i]);}if(arguments.length === 2){//另外的方法}else if(arguments.length === 3){}if(x>=0){return x;}else{return -x;}}
问题:arguments包含所有的参数,我们有时候想要使用多余的参数来进行附加操作时,需要排除已有的参数,且已有参数也不固定
rest
以前:
if(arguments.length > 2){for(var i = 2; i < arguments.length; i++){//...}}
ES6引入的新特性,获取除了已经定义的参数之外的所有参数...
function aaa(a,b,...rest){console.log("a=>"+a);console.log("b=>"+b);console.log(rest);}
rest参数只能写在最后面,必须用...标识。
变量的作用域
Java(局部变量,全局变量。类变量)
在JavaScript中,var定义变量实际是有作用域的
假设在函数体中声明,则在函数体外不可以使用 (想实现的话,后面研究闭包)
function lyc(){var x = 1;x = x + 1;}x = x + 2;// Uncaught ReferenceError: x is not define
如果两个函数使用了相同的变量名只要在函数内部,就不冲突
'use strict'function lyc(){var x = 1;x = x + 1;}function lyc1() {var x = "A";x = x + 1;}
内部函数可以访问外部函数的成员,反之则不行
function lyc(){var x = 1;//内部函数可以访问外部函数的成员,反之则不行function lyc1() {var y = x + 1;//2}var z = y + 1;//Uncaught ReferenceError: y is not defined}
假设内部函数变量和外部函数变量重名
function lyc1() {var x = 'A';console.log('inner'+x)}console.log('outer'+x)lyc1();}
假设在JavaScript中函数查找变量从自身函数开始~,由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量
提升变量的作用域
function lyc(){var x = 'x' + y;console.log(x);var y = 'y';}
结果: x undefined
说明JavaScript的执行引擎,自动提升了y的声明,但是不会提升变量y的赋值
function lyc2(){//习惯写法,将所有的变量写在最前面var y;var x = 'x' + y;console.log(x);y = 'y';}
这个是在JavaScript建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护
function lyc2(){var x = 1,y = x + 1,z,i,a;//之后随便用}
全局函数
var x = 1;function f(){console.log(x)}f();console.log(x);
全局对象 window
var x = 'xxx'window.alert(x);alert(window.x);
alert() 这个函数本身也是一个window变量
var x ='xxx';window.alert(x);var old_alert = window.alert;window.alert = function(){};//发现alert()失效了window.alert(123);//恢复window.alert = old_alert;window.alert(456);
JavaScript实际上只有一个全局作用域,任何变量(函数也可以被视为变量),假设没有在函数作用范围找到,就会向外查找,如果在全局作用域都没有找到,则报错ReferenceError
规范 :由于我们所有的全局变量绑定到Window上,如果不同的JS文件使用相同的全局变量,就会冲突->如何减少冲突
//唯一全局变量var lyc = {};//定义全局变量lyc.name = 'lyc';lyc.add = function (a,b){return a+b;}
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突
局部作用域 let
function aaa(){for(var i = 0; i < 100; i++){console.log(i)}console.log(i+1)//问题:i出了这个作用域还在使用}
ES6 let关键字,解决局部作用域冲突问题
function aaa(){for(let i = 0; i < 100; i++){console.log(i)}console.log(i+1)//问题:i出了这个作用域还在使用}
建议大家使用let去定义局部作用域的变量
常量 const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量,建议不要修改这样的值
在ES6引入了常量关键字const
const PI = '3.14';//只读变量console.log(PI);PI = '123'; //TypeError:Assignment to constant varibleconsole.log(PI)
方法
方法就是把函数放在对象的内部,对象只有两个东西:属性,方法
var lyc = {name:'lyc',birth:1995,age:function (){var now = new Date().getFullYear();return now-this.birth;},sex:'男',height:1.70,weight:60,say:function () {console.log(this.name+"说:我叫"+this.name+",今年"+lyc.age()+"岁,身高"+this.height+"米,体重"+this.weight+"kg,性别"+this.sex)}}
this.代表什么?代表调用这个方法或属性的对象
function getAge(){var now = new Date().getFullYear();return now-this.birth;}var lyc = {name:'lyc',birth:1995,age:getAge,sex:'男',height:1.70,weight:60,say:function () {console.log(this.name+"说:我叫"+this.name+",今年"+lyc.age()+"岁,身高"+this.height+"米,体重"+this.weight+"kg,性别"+this.sex)}}//lyc.age() 30//getAge() NaN 调用getAge()的是window对象,
this是无法指向的,是默认指向调用它的那个对象
apply
在JS中可以控制this指向
function getAge(){var now = new Date().getFullYear();return now-this.birth;}var lyc = {name:'lyc',birth:1995,age:getAge,sex:'男',height:1.70,weight:60,say:function () {console.log(this.name+"说:我叫"+this.name+",今年"+lyc.age()+"岁,身高"+this.height+"米,体重"+this.weight+"kg,性别"+this.sex)}};getAge.apply(lyc)//this,指向了lyc,参数为空
以上就是JavaScript函数中的主要用法,希望对大家有帮助!
相关文章:
JavaScript快速入门之函数
引言 总所周知,JavaScript是一个很随便的语言,因此,在学习它的语法的时候,我是和Java语法对比着学的,可能会有些绕 函数 方法:对象(属性,方法) 函数:放在对…...
Java中synchronized 和 Lock
1. synchronized 关键字 工作原理 对象锁:在Java中,每个对象都有一个与之关联的监视器锁(monitor lock)。当一个线程尝试进入由 synchronized 保护的代码块或方法时,它必须首先获取该对象的监视器锁。如果锁已经被其…...
Linux系统-ls命令
一、ls命令的定义 Linux ls命令(英文全拼:list directory contents)用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。 二、ls命令的语法 ls [选项] [目录或文件名] ls [-alrtAFR] [name...] 三、参数[选项…...
个人学习编程(3-24) 数据结构
括号的匹配: if((s[i]) && now() || (s[i]] && now[)){ #include <bits/stdc.h>using namespace std;int main() {char s[300];scanf("%s",&s);int i;int len strlen(s);stack <char> st;for (i 0; i < len; i){if(…...
.NET开源的智能体相关项目推荐
一、AntSK 由AIDotNet团队开发的人工智能知识库与智能体框架,支持多模型集成和离线部署能力。 核心能力: • 支持OpenAI、Azure OpenAI、星火、阿里灵积等主流大模型,以及20余种国产数据库(如达梦) • 内置语义内核&a…...
面试八股文--框架篇(SSM)
一、Spring框架 1、什么是spring Spring框架是一个开源的Java平台应用程序框架,由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型,用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入(DI…...
跨语言语言模型预训练
摘要 最近的研究表明,生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中,我们将这一方法扩展到多种语言,并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型(XLM)的方法:一种…...
[识记]Mysql8 远程授权
今天在测试docker时,因更换为Mysql8,使用SQL方式实现远程授权,其方式方法同于Mysql,但语句稍有不同,仅供参考。 登录mysql mysql -u root -p 输入密码: [请依据交互输入你的mysql密码]切换数据库 use mysql;选择需要…...
Nodejs上传文件的问题
操作系统:window和linux都会遇到 软件环境:v20.10.0的Nodejs 1、前端代码如下: 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下: 3、用页面上传文件 查看具体报错原因: TypeError: sourc…...
无人机螺旋桨平衡标准
螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音,并加速关键部件的磨损,从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架,定义了可接受的不平衡…...
Qt开发:双缓冲机制
文章目录 什么是双缓冲机制?Qt 中的双缓冲实现方式 什么是双缓冲机制? 双缓冲(Double Buffering) 是一种减少屏幕绘制闪烁的技术,广泛用于图形渲染和游戏开发。 它的基本原理是: 先在后台缓冲区࿰…...
HandyJSON原理
HandyJSON 的优势 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …...
SpringBoot+策略模式+枚举类,使用配置文件改进,优雅消除if-else,完全符合OOP原则
需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...
[力扣每日一练]关于MySQL和pandas的正则表达式应用
一:题目要求 表:Users-------------------------- | Column Name | Type | -------------------------- | user_id | int | | email | varchar | -------------------------- (user_id) 是这张表的唯一主键。 每一行包含用…...
每日免费分享之精品wordpress主题系列~DAY16
主题介绍: 今日在网上寻找wordpress主题的时候逛到了大叔的网站,赶脚这个主题蛮不错的,于是百度一下,果然,这个主题很受欢迎。作为主题下载站追梦者也不甘落后,马上就发布出来了,希望对你们有用…...
OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程,隐藏了许多底层细节…...
MySQL 用户权限与安全管理
MySQL 用户权限与安全管理 在数据库系统中,用户权限与安全管理是保障数据安全性、完整性和隐私性的核心机制。MySQL 提供了丰富的权限管理功能,可以精细地控制用户对数据库、表以及其他数据库对象的访问权限,同时也支持各种安全管理策略来防…...
dify + deepseek /qwen + win +xinference 等完成知识库建设
Dify.AI The Innovation Engine for Generative AI Applications 简介:Dify是一个用于构建人工智能应用程序的开源平台。我们将后端即服务和LLMOps相结合,简化了生成式人工智能解决方案的开发,使开发人员和非技术创新者都可以使用。CPU>…...
模数转换电路(A/D转换器)
A/D转换,是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多,按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量,后者是先将模拟电压量转换成一个中间量,再将中间量转换成数字量。 …...
算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码
一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...
OpenAI深夜直播「偷袭」谷歌!GPT-4o原生图像生成:奥特曼带梗图,AGI战场再燃战火
引言:AI战场的「闪电战」 当谷歌刚刚发布「地表最强」Gemini 2.5 Pro时,OpenAI立即以一场深夜直播「闪电反击」——GPT-4o的原生图像生成功能正式上线!从自拍变梗图到相对论漫画,奥特曼(OpenAI团队)用一连…...
【深度学习】Cross-Attention(交叉注意力)机制详解与应用
Cross-Attention(交叉注意力)机制详解与应用 文章目录 Cross-Attention(交叉注意力)机制详解与应用引言什么是Cross-Attention?Cross-Attention的数学表示Cross-Attention与Self-Attention的区别Cross-Attention的应用…...
《大语言模型赋能证券业开发安全:海云安技术方案在上交所专刊发表》
近日,海云安《大语言模型在证券业开发安全领域的探索与实践》技术方案经过上海证券交易所(以下简称”上交所“)行业专家评审后正式收录于《交易技术前沿——网络安全专刊(2025年第1期 总第61期)》。 证券信息技术研究…...
光流 | 基于光流的人体异常行为检测算法原理,公式,算法改进,matlab代码
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人体异常行为检测 一、算法原理与数学模型1. 核心原理2. 关键公式二、算…...
【蓝桥杯】单片机设计与开发,中断系统,外部中断(下)
一、例程一:外部中断执行函数 #include<stc15.h>void main(void) {P20XA0;P00X00;P20X80;P00XFF;IT00;//设置外部中断0;上升沿下降沿均可//IT01;//设置外部中断0;仅下降沿EX01;//允许中断0申请中断EA 1;//打开CPU总中断while(1); }voi…...
【测试工具】如何使用 burp pro 自定义一个拦截器插件
在 Burp Suite 中,你可以使用 Burp Extender 编写自定义拦截器插件,以拦截并修改 HTTP 请求或响应。Burp Suite 支持 Java 和 Python (Jython) 作为扩展开发语言。以下是一个完整的流程,介绍如何创建一个 Burp 插件来拦截请求并进行自定义处理…...
MySQL、创建数据库、表、SQL 函数:数学函数、字符串函数、日期函数、聚合函数
DAY18.1 Java核心基础 MySQL 创建数据库 数据库是一个服务,实际开发需要根据具体的项目创建对应的数据库实例 create database mytest1 default character set utf8 collate utf8_general_ci; create database mytest2 default character set utf8 collate utf8…...
关于我对接了deepseek之后部署到本地将数据存储到mysql的过程
写在前面 今天写一下使用nodejs作为服务端,vue作为客户端,mysql的数据库,对接deepseek的全过程,要实现一个很简单的效果就是,可以自由的询问,然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…...
23种设计模式-策略(Strategy)设计模式
策略设计模式 🚩什么是策略设计模式?🚩策略设计模式的特点🚩策略设计模式的结构🚩策略设计模式的优缺点🚩策略设计模式的Java实现🚩代码总结🚩总结 🚩什么是策略设计模式…...
【Exception】MybatisPlusException: can not find lambda cache for this entity
文章目录 环境 | Environment复现步骤 | Reproduction steps报错日志 | Error log源码 | Source CodeUserServiceImpl.javaAddressServiceImpl.javaAbstractSubTableBaseServiceImpl.javaUserEntity.javaAddressEntity.javaSubTableBaseEntity.java 原因分析 | Analysis解决方案…...
