函数的概念:具备某个功能的工具,完成某个功能的代码,像是系统自带的有:isNaN(),parseInt()等等,但是今天要学的是自定义函数
语法:function 函数名(){
代码段
}
函数的调用: 函数名()
这样我们以后还要执行函数中的代码时候,直接调用就可以了
函数定义的本质,就是在内存中开辟一个空间,这个空间名就是函数名,空间值就是代码段
带参函数 :当函数代码中的某些数据在调用中发生变化,就需要将这个数据当做变量放在函数名旁边的小括号中,而这部分叫做形参,当函数调用时,给小括号的变量赋值时,叫做实参
function zizeng(a){ // 叫做形参 - 形式上的参数
var b = a + 1;
console.log(b);
}zizeng(1)//实参
不给形参赋值,默认值是undefined
赋值式函数:将一个函数被赋值给一个变量,此时这个函数的名称就没有用了,可以被省略
var hanshu = function () {
var a = 1
var b = 2
var c = a + b
console.log(c);
}
hanshu()
变成赋值函数,函数名称就不能再使用了,但此时还是可以调用
变量类型是function,值就是函数代码
匿名函数
没有函数名称的叫做匿名函数
var hanshu = function() {
var a = 1
var b = 2
var c = a + b
console.log(c);
}
注意事项
匿名函数不能单独出现,除非整个用括号包起来,或者在函数前面添加 !/ ~
(function(){
console.log(11);
})
在此基础上,在匿名函数后面另外添加一个小括号,等于这个函数被调用了,不过这个函数只能被调用一次---自调用函数
(function(){
console.log('这是fn函数');
}) ()
带返回值的函数 return
让调用函数的代码变成一个具体的值,return后面的代码不再执行,如果return后面没有值,默认值时undefined
function fn(n) {
var k = 0
for(var i=1; i<=n; i++) {
if(i % 2 === 0) {
k++
}
}
// console.log(k);
return k
}
console.log(fn(10));
function add(a, b) {
return a+b
}
console.log( '1+2='+add(1,2) );
return只能返回一个值
案例: function add(a, b, c) {
var sum1 = a + b //sum1 = 4
var sum2 = a + c //sum2 = 6
var sum3 = b + c //sum3 = 8
return sum1, sum2, sum3 }
var d = add(1, 3, 5)
console.log(d); // 8
默认返回一个且为最后一个值
预解析
-
预解析js代码
预解析的过程,就是查找代码中的var和function这两个关键字,找到以后,将变量和函数提前存到内存中,并给他们赋一个初始值,变量的初始值为undefined,函数的初始值为代码段。
-
开始按顺序一行一行解读代码
解读代码的时候,会略过变量和函数的定义,因为变量和函数的定义已经提前放在内存中了,提前储存的变量和函数的值会随着代码的解读而发生变化,也就是变量的赋值和函数的调用。
预解析分为变量的预解析和函数的预解析,也就是代码在执行之前先进行解析,将变量和函数的定义放在内存中。
注意被赋值函数的变量,之后在赋值其他数据后,用调用函数是用不出来的
预解析总结:
-
匿名函数赋值给变量的定义方式,预解析时遵循变量的预解析规则,不会将函数代码预解析
-
预解析的时候,会将定义提前放在内存中,不会提前将赋值放在内存中
-
如果变量名和函数名同名了,保留函数预解析,忽略变量预解析
因为函数预解析其实包含了赋值的过程,函数定义放在内存中的时候将函数的代码也放在内存中
变量的预解析只有空间,没有值,所以如果是先预解析变量,那后面的函数预解析赋值就将空间中放入了值,如果是先预解析的函数,再次预解析变量的时候,空间已经存在了,再次定义空间也是没有意义的。
-
省略var定义的变量是不会有预解析的
-
js代码如果报错了,那后面的代码就不会执行了
-
不会执行的代码中有变量或函数定义也会预解析,因为预解析在执行之前。