JavaScript快速入门之函数

news2025/3/31 19:10:40

引言

总所周知,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 varible
 console.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函数中的主要用法,希望对大家有帮助! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人学习编程(3-24) 数据结构

括号的匹配&#xff1a; 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(…

面试八股文--框架篇(SSM)

一、Spring框架 1、什么是spring Spring框架是一个开源的Java平台应用程序框架&#xff0c;由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型&#xff0c;用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入&#xff08;DI&#xf…

跨语言语言模型预训练

摘要 最近的研究表明&#xff0c;生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中&#xff0c;我们将这一方法扩展到多种语言&#xff0c;并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型&#xff08;XLM&#xff09;的方法&#xff1a;一种…

Nodejs上传文件的问题

操作系统&#xff1a;window和linux都会遇到 软件环境&#xff1a;v20.10.0的Nodejs 1、前端代码如下&#xff1a; 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下&#xff1a; 3、用页面上传文件 查看具体报错原因&#xff1a; TypeError: sourc…

无人机螺旋桨平衡标准

螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音&#xff0c;并加速关键部件的磨损&#xff0c;从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架&#xff0c;定义了可接受的不平衡…

SpringBoot+策略模式+枚举类,使用配置文件改进,优雅消除if-else,完全符合OOP原则

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

每日免费分享之精品wordpress主题系列~DAY16

主题介绍&#xff1a; 今日在网上寻找wordpress主题的时候逛到了大叔的网站&#xff0c;赶脚这个主题蛮不错的&#xff0c;于是百度一下&#xff0c;果然&#xff0c;这个主题很受欢迎。作为主题下载站追梦者也不甘落后&#xff0c;马上就发布出来了&#xff0c;希望对你们有用…

OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程&#xff0c;隐藏了许多底层细节…

dify + deepseek /qwen + win +xinference 等完成知识库建设

Dify.AI The Innovation Engine for Generative AI Applications 简介&#xff1a;Dify是一个用于构建人工智能应用程序的开源平台。我们将后端即服务和LLMOps相结合&#xff0c;简化了生成式人工智能解决方案的开发&#xff0c;使开发人员和非技术创新者都可以使用。CPU>…

模数转换电路(A/D转换器)

A/D转换&#xff0c;是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多&#xff0c;按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量&#xff0c;后者是先将模拟电压量转换成一个中间量&#xff0c;再将中间量转换成数字量。 …

算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码

一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…

《大语言模型赋能证券业开发安全:海云安技术方案在上交所专刊发表》

近日&#xff0c;海云安《大语言模型在证券业开发安全领域的探索与实践》技术方案经过上海证券交易所&#xff08;以下简称”上交所“&#xff09;行业专家评审后正式收录于《交易技术前沿——网络安全专刊&#xff08;2025年第1期 总第61期&#xff09;》。 证券信息技术研究…

【蓝桥杯】单片机设计与开发,中断系统,外部中断(下)

一、例程一&#xff1a;外部中断执行函数 #include<stc15.h>void main(void) {P20XA0;P00X00;P20X80;P00XFF;IT00;//设置外部中断0&#xff1b;上升沿下降沿均可//IT01;//设置外部中断0&#xff1b;仅下降沿EX01;//允许中断0申请中断EA 1;//打开CPU总中断while(1); }voi…

MySQL、创建数据库、表、SQL 函数:数学函数、字符串函数、日期函数、聚合函数

DAY18.1 Java核心基础 MySQL 创建数据库 数据库是一个服务&#xff0c;实际开发需要根据具体的项目创建对应的数据库实例 create database mytest1 default character set utf8 collate utf8_general_ci; create database mytest2 default character set utf8 collate utf8…

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面 今天写一下使用nodejs作为服务端&#xff0c;vue作为客户端&#xff0c;mysql的数据库&#xff0c;对接deepseek的全过程&#xff0c;要实现一个很简单的效果就是&#xff0c;可以自由的询问&#xff0c;然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…

23种设计模式-策略(Strategy)设计模式

策略设计模式 &#x1f6a9;什么是策略设计模式&#xff1f;&#x1f6a9;策略设计模式的特点&#x1f6a9;策略设计模式的结构&#x1f6a9;策略设计模式的优缺点&#x1f6a9;策略设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是策略设计模式…

vue ts+Windi CSS

1、创建vue项目 trae&#xff08;字节&#xff09;打开一个空文件夹 npm install -g vue/cli vue create my-project cd my-project vue add typescript npm run serve vue项目创建完成 2、安装windicss vue add windicss vue.config.js配置 npm install vue-router …

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

GPT-SoVITS本地部署:低成本实现语音克隆远程生成音频全流程实战

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS&#xff01;这款由花儿不哭大佬精心打造的语音克隆神…

Flutter视频播放优化

在Flutter中实现流畅视频播放&#xff0c;选择合适的播放器插件是关键。推荐使用以下两类插件&#xff1a; 跨平台低延迟方案 flutter_vlc_player&#xff1a;基于VLC引擎&#xff0c;支持RTSP/RTMP协议&#xff0c;通过hwAcc: HwAcc.full启用硬件加速&#xff0c;配合setOpti…