写在前面的话
- 本文主要总结归纳了JavaScript的函数一些基础知识,JavaScript语法自由,但是会与传统的面向对象语言的一些语法有差异,因此记录本文,以便后续查阅,文中如有错误,请看官留言指正,共同交流,进步,谢谢!
函数的声明
- function 函数名([形式参数]){//函数体}
- 函数声明只是告诉js这个函数存在。
- 函数只有先调用,才会被执行。
- 函数调用:
- 函数名([实际参数])
- 圆括号内根据需要可以声明形参,定义形参的时候只需要参数名,而不要var来声明。形参的个数不固定,根据需要,可以有多个形,也可以一个也没有。(圆括号内的形参有时候我们也称之为形参列表)
关于函数的返回值
- return
- return语句的语法是:return 返回值; 返回值可以省略,表示仅仅结束函数。
- 如果省略return语句或者有return但是没有返回值,这个时候,返回的是undefined
- 1、如果想给调用者返回值,则可以通过return来返回。
- 2、如果一个方法没有显式的使用return,则这个方法默认返回的是undefined。
- 3、只要在函数内部碰到了return,那么这个函数不管还有多少代码,不管循环有多深,不管循环有没有执行完,都会立即结束函数,并返回返回值。
关于函数参数的一些特殊说明:
- 1、如果传递实参的个数小于形参的个数,则后面的不会赋值,默认为undefined。
- 2、传递的实参可以多余形参的个数。
function add(a, b, c){
if(a === undefined){
a = 0;
}
if(b === undefined){
}
// a = a === undefined ? 0 : a;
a = a || 0; //a为null时是个
}
- 任何的函数都有一个内部的对象arguments,看成一个数组,就存储了我们传入的所有的参数。
作用域
1、全局作用域
- 整个脚本都属于全局作用域
2、函数作用域
函数内部
全局变量:
在函数外部声明的变量就叫全局变量。
局部变量:
- 在函数内部声明的变量,就是局部变量。
- 如果在一个函数的内部声明变量的时候没有使用var,那么这个变量将自动成为全局变量。
- 注意:使用严格模式的时候,不能省略var来声明
function f(){a = 5} alert(a);//输出5
- 总结:
- 1、在函数内部可以访问全局变量
- 2、在函数内部可以访问这个函数内部定义的局部变量
- 3、函数外部不能访问局部变量
- 4、如果在函数内部出现于全局变量重名的变量,则局部变量覆盖全局变量。
- 5、局部变量也会声明提前,提前到这个函数的最顶。
匿名函数
- 没有名字的函数
- 函数名.name 返回的是这个函数的名字
可能只执行一次的时候,就可以考虑用匿名函数。
boolean,number,string这三种,可以认为每次把基本数据类型的值复制一份,传递到方法的内部。
变量的话,可以不加引号,如果不是的话,一般都要加。
匿名函数的自执行技术:
(function(){alert("我是一个匿名函数");})();
或:
(function(){alert("我是一个匿名函数");}());
---------------
var max = (function(m, n){
return m > n ? m : n})(5, 6);
alert(max);
模拟重载
- 1、声明的所有全局函数,都会声明提前。换句话说,我们可以先调用,把函数的声明放在后面也是可以的。
- 2、函数可以重复声明,但是后声明的会自动覆盖前声明的。
- 3、js中就没有重载的存在。
函数的递归调用
- 递归:函数自己调用自己
- 1、递归调用栈会越来越深,占用的内存越来越多。
- 使用递归一定要满足两个条件:
- 1、必须要有递归结束的条件
- 2、随着递归的深入,必须能够达到那个结束条件(收敛)
一些细节例子
传递多个参数的时候
function add(a, b, c){
if(a === undefined){
a = 0;
}
if(b === undefined){
}
// a = a === undefined ? 0 : a;
a = a || 0; //a为null时是个
}
function add () {
var sum = 0;
// alert(arguments.length); //表示传递的参数的个数
for(var i = 0; i < arguments.length; i++){
sum +=arguments[i];
}
return sum;
}
alert(add(1, 2, 5));
alert(add(1, 2, 5,400));
作用域的问题
var a = 10;
function f(){
alert(a); //undefined
var a = 5;
}
f(); //undefined
4.如果在函数内部出现与全局变量重名的变量,则局部变量覆盖全局变量。
5.局部变量也会声明提前,提前到这个函数的最顶。
a =10;
function f() {
alert(a);
a = 5;
}
f();//先调用函数,输出10
alert(a);//调用函数的时候,没有var,所以a=5成为全局变量,执行完函数后,alert输出5,严格模式不行
function f() {
alert(a);
a = 5;
}
f();
alert(a);//没有输出,直接报f函数里的a没定义
匿名函数
var div = document.getElementsByTagName("div")[0];
div.onmouseover = function() {
div.style.backgroundColor = "blue";
}
div.onmouseout = function() {
div.style["background-color"] = "pink";
}