疑问:函数是什么,为什么要有函数,函数的出现解决了什么问题
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、构造函数(创建对象的模板)