JS中无处不在的————函数

151 阅读4分钟

疑问:函数是什么,为什么要有函数,函数的出现解决了什么问题

1、函数是什么?

函数:在数学上的定义,任意x的值,都有一个确定的y值与其对应,y=f(x),函数的值是具有确定性的。

在JS中,函数是一种数据类型,这种数据类型需要一个function关键字来声明。

函数的组成部分:function关键字、 函数名 、参数列表、函数体、返回值(return)。

注:函数的名称、参数列表、返回值是可选的。

function a(arg1,arg2){
	let result=arg1+arg2
	return result
}
console.log(test('hello','world'));

1、 test就是函数的名称;

2、 函数名称后面的圆括号()就是参数列表,参数列表里面的arg1,arg2就是形参;调用者括号里面的就实参。如果函数的参数列表没有定义形参,而调用者传了实参,在函数体内获取到实参代码如下:

function test(){
	let result=arguments[0]+arguments[1];
	return result
}
console.log(test('hello','world'));//helloworld

2-1:arguments又是什么呢?

arguments是函数被调用的时候,根据实参生成的一个伪数组对象(类数组对象),这个对象的属性是以调用者传递实参所在的下标命名的,代码如下:

function test(){
	var arguments={
		0:'hello',
		1:'world',
		length:2
	}
}
test('hello', 'world')

(可以通过Array.prototype.slice.call(arguments)和Array.from(arguments)2种方法让它变成真正的数组)

arguments和实参是一种映射的关系,无论谁改,对方的值都随之而改,(可以删除了arguments对象的某一个属性,产生的现象在以下代码中)。代码如下:

function test(agr1) {
	console.log(arguments.length); //2 实参的个数
	arguments[3] = "good" //给arguments添加一个属性
	arguments.length = 0;
	console.log(arguments.length); //0
	console.log(`${arguments[0]} ${arguments[1]}`); //hello world
	console.log(agr1); //hello
	agr1 = 'Hi';
	console.log(`${arguments[0]} ${arguments[1]}`); //Hi world
	console.log(agr1 === arguments[0]); //true
	delete arguments['0']
	console.log(agr1); //Hi
	console.log(`${arguments[0]} ${arguments[1]}`); //undefined world
	arguments[0] = "哈哈,我又回来了"
	console.log(`${arguments[0]} ${arguments[1]}`); //哈哈,我又回来了 world
	console.log(agr1); //哈哈,我又回来了
	console.log(agr1 === arguments[0]); //true
	var result = arguments[0] + arguments[1];
	return result
}
console.log(test('hello', 'world'));//哈哈,我又回来了 world

3、 花括号{}就是函数体,花括号里面的内容就是函数的执行语句;

4、 return,就是把函数执行的结果返回给调用者。如果代码中没有明确写return。js总是返回一个undefined或者this这个this就是当前对象,如果不想返回默认的this,只能返回一个引用值,否则无效。代码如下:

function test() {
	
}
console.log(test());//undefined

function Test(){
	this.name="Hello"
}
var obj=new Test()
console.log(obj);//{name: "Hello"}

function Test2(){
	this.name="Hello"
	return {sex:'男'}
}
console.log(new Test2());{sex: "男"}

function Test3(){
	this.name="Hello"
	return "man"
}
console.log(new Test3());//{name: "Hello"}

5、函数的使用 函数是以函数名+圆括号()或者变量名+圆括号()进行调用,这个括号里面可以写任何数量、任何类型的实参,也可以不写。

6、函数的形参默认值的2种写法

// ES6的写法
function test(a = 1, b = 2) {
	console.log(a + b); //3
}
test()

// ES5的写法
function test2(a, b) {
	a = arguments[0] || 3
	b = arguments[1] || 4
	console.log(a + b); //7
}
test2()

7、函数的声明方式有3种:1、函数声明;2、函数表达式(函数字面量);3、箭头函数

//函数声明
function a(){}
//函数表达式,函数的名称是可选的,这个函数也叫匿名函数
var b=function(){}
//箭头函数
var c=()=>{}

7-1、函数表达式的注意点:

函数表达式如果写了函数的名称,

1、这个名称在函数的外部是不可见的。

2、在函数体内是可见的。

以下代码验证上面的观点:

var fn = function anonymous() {
	console.log(arguments.callee.name); //anonymous 证明观点1
}
console.log(typeof(anonymous)); //undefined 证明观点2
fn()
var temp = 10
//function example(){}也是表达式
if (function example() {}) {
	temp += typeof(example)
}
console.log(temp); //10undefined  证明观点1

2、为什么要有函数?

如果某一个“功能代码段”被重复使用,那么可以把这个“功能代码段”抽离出来封装函数在里面,使之达到可以被重复使用,让这个代码段形成一个独立的功能模块。

3、函数的出现解决了什么问题?

函数的出现,降低了代码的耦合度,让代码的职责更加专一。模块化开发的目的就是让代码实现:低耦合高内聚,使代码的可读性和维护性更强。

4、函数的种类:

1、工具函数(普通函数)

2、构造函数(创建对象的模板)