JavaScript快速入门之函数

server/2025/3/31 20:43:59/

引言

总所周知,JavaScript是一个很随便的语言,因此,在学习它的语法的时候,我是和Java语法对比着学的,可能会有些绕

函数


方法:对象(属性,方法)

函数:放在对象外面的方法

定义函数

定义方式一

绝对值函数

javascript"> function abs(x){if(x>=0){return x;}else{return -x;}}

一旦执行到return代表函数结束,返回结果!

如果没有执行return,函数执行完也会返回结果,结果就是undefined(未定义)

定义方式二

javascript"> var abs = function(x){if(x>=0){return x;}else{return -x;}}//类似于匿名内部类

function(x){...} 这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!

方法一和方法二等效

调用函数

javascript">abs(10)

参数问题:JavaScript 可以传任意个参数,也可以不传递参数

参数传进来是否存在的问题?假设不存在参数,如何规避

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来拿到第二个参数进行使用

  
javascript">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

以前:

javascript"> if(arguments.length > 2){for(var i = 2; i < arguments.length; i++){//...}}

ES6引入的新特性,获取除了已经定义的参数之外的所有参数...

javascript"> function aaa(a,b,...rest){console.log("a=>"+a);console.log("b=>"+b);console.log(rest);}

rest参数只能写在最后面,必须用...标识。

变量的作用域

Java(局部变量,全局变量。类变量)

在JavaScript中,var定义变量实际是有作用域的

假设在函数体中声明,则在函数体外不可以使用 (想实现的话,后面研究闭包)

javascript"> function lyc(){var x = 1;x = x + 1;}x = x + 2;//  Uncaught ReferenceError: x is not define

如果两个函数使用了相同的变量名只要在函数内部,就不冲突

javascript">   'use strict'function lyc(){var x = 1;x = x + 1;}function lyc1() {var x = "A";x = x + 1;}

内部函数可以访问外部函数的成员,反之则不行

javascript"> function lyc(){var x = 1;//内部函数可以访问外部函数的成员,反之则不行function lyc1() {var y = x + 1;//2}var z = y + 1;//Uncaught ReferenceError: y is not defined}

假设内部函数变量和外部函数变量重名

javascript"> function lyc1() {var x = 'A';console.log('inner'+x)}console.log('outer'+x)lyc1();}

假设在JavaScript中函数查找变量从自身函数开始~,由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量

提升变量的作用域

javascript"> function lyc(){var x = 'x' + y;console.log(x);var y = 'y';}

结果: x undefined

说明JavaScript的执行引擎,自动提升了y的声明,但是不会提升变量y的赋值

javascript"> function lyc2(){//习惯写法,将所有的变量写在最前面var y;var x = 'x' + y;console.log(x);y = 'y';}

这个是在JavaScript建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护

javascript"> function lyc2(){var x = 1,y = x + 1,z,i,a;//之后随便用}

全局函数

javascript"> var x = 1;function f(){console.log(x)}f();console.log(x);

全局对象 window

javascript"> var x = 'xxx'window.alert(x);alert(window.x);

alert() 这个函数本身也是一个window变量

javascript"> 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文件使用相同的全局变量,就会冲突->如何减少冲突

javascript"> //唯一全局变量var lyc = {};//定义全局变量lyc.name = 'lyc';lyc.add = function (a,b){return a+b;}

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突

局部作用域 let

javascript"> function aaa(){for(var i = 0; i < 100; i++){console.log(i)}console.log(i+1)//问题:i出了这个作用域还在使用}

ES6 let关键字,解决局部作用域冲突问题

javascript"> function aaa(){for(let i = 0; i < 100; i++){console.log(i)}console.log(i+1)//问题:i出了这个作用域还在使用}

建议大家使用let去定义局部作用域的变量

常量 const

在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量,建议不要修改这样的值

在ES6引入了常量关键字const

javascript"> const PI = '3.14';//只读变量console.log(PI);PI = '123'; //TypeError:Assignment to constant varibleconsole.log(PI)
方法

方法就是把函数放在对象的内部,对象只有两个东西:属性,方法

 
javascript">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.代表什么?代表调用这个方法或属性的对象

javascript"> 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指向

javascript"> 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.ppmy.cn/server/179995.html

相关文章

23种设计模式-代理(Proxy)设计模式

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

干货分享|DeepSeek技术革命、算力范式重构与场景落地洞察

本文为TsingtaoAI公司负责人汶生为某证券公司管理层和投资者教授的《DeepSeek技术革命、算力范式重构与场景落地洞察》主题培训内容&#xff0c;此次主题培训系统阐述了当前AI技术演进的核心趋势、算力需求的结构性变革&#xff0c;以及行业应用落地的关键路径。 现在我们将全…

【Python爬虫】使用python脚本拉取汽车网站品牌数据

示例代码说明&#xff1a; 在汽车之家网站拉取当月排行榜中汽车品牌、销量和价格信息&#xff0c;存为csv文档输出&#xff0c;使用正则表达式获取网页内容 import re import pandas as pd import requests# 汽车之家车型列表页URL url https://cars.app.autohome.com.cn/ca…

【redis】数据类型之Stream

Redis Stream是Redis 5.0版本引入的一种新的数据类型&#xff0c;它提供了一种持久化的、可查询的、可扩展的消息队列服务。 它结合了Redis高性能的特性与持久化能力&#xff0c;支持&#xff1a; 多消费者组模式&#xff08;Consumer Groups&#xff09;消息回溯&#xff08…

vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 &#xff0c; 这次的功能是将公式能插入编辑器以及修改 1、Tinymce 自定义 LateX 按钮&#xff0c;打开公式编辑器窗口 LateX.vue window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton(LateX, {text:…

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题&#xff1a; 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…

面试提问:数仓建设中维度退化一般在哪一层做?可不可以不进行维度退化?

前言 面试提问:最近小A同学去某零售公司面试,面试快结束的时候,面试官抛出这么一个问题:数仓建设中维度退化你们是在哪一层做的?小A同学很爽快的回答道,我们通常是在DWD层进行维度退化。接着面试官继续问道:维度退化为什么不在DWS层做?可不可以不进行维度退化?面试结…

无人机宽带自组网机载电台技术详解,50KM超远图数传输系统实现详解

以下是关于无人机宽带自组网机载电台技术以及50KM超远图数传输系统实现的详解&#xff1a; 无人机宽带自组网机载电台技术详解 无人机宽带自组网机载电台是一种专门为无人机设计的通信设备&#xff0c;它支持宽带数据传输和自组网功能。这种电台的实现技术涉及多个方面&#x…