函数常见错误
1.函数外的变量与函数内的同名形参不是同一变量
2.函数内部可以调用其他的函数(包括自身)
arguments伪数组
当不确定用户是否传入了参数,或不知道用户传入了多少参数。
使用arguments对象可以获取传入的每个参数的值
function f1(){
var sum = 0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
console.log(f1(10,20,30));
函数的其它定义方式
1.命名函数 ----函数有名字
函数定义:
function 函数名(){
函数体
}
2.匿名函数 ----函数没有名字
函数的另一种定义方式 ---函数表达式(把一个函数给一个变量)
函数表达式后要加 ” ;“
var f = function(){
函数体
};
f(); //调用
命名函数-函数定义若出现重名,则不管在哪调用 后一个函数会覆盖掉前面的重名函数
匿名函数-函数表达式若出现重名,若在后一个函数表达式定义前调用前一个函数则不会被覆盖,类似于变量的特性
2.2 匿名函数--另一种函数调用--函数的自调用
一次性的-----安全,不会出现冲突
(function (){
console.log("hello,world!")
};)();
函数作为参数使用
如果一个函数作为参数,那么这个参数(函数)叫回调函数
function f1(fn){
fn();
}
function f2(){
console.log("abcd");
}
f1(f2);
函数作为返回值使用
function f1(){
console.log("f1函数被调用了");
return function(){
console.log("这是一个函数");
};
}
var ff = f1(); //此时ff成为一个函数
ff();
作用域
全局变量:使用var声明的非在函数内声明的变量
全局变量若页面不关闭,则不会释放,会占据空间,消耗内存,不可被删除
局部变量:函数内部定义的变量,只能在该函数内使用
隐式全局变量:声明的变量没用var,可以被删除!!
全局作用域:全局变量的使用范围
局部作用域:局部变量的使用范围
块级作用域:一对大括号可以看成一块,其中的变量只能在该区域使用
JS没有块级作用域,只有函数除外
写代码要注意变量的声明位置及使用问题
作用域链
var num = 0;
function f1(){
var num = 10;
function f2(){
var num = 20;
function f3(){
var num = 30;
console.log(num);
}
f3();
}
f2();
}
f1();
函数就近使用同名函数变量,最近变量作用域变量
预解析
预解析会分段,各个script标签内的预解析不会相互影响
定义: 提前解析–代码中的变量声明,函数声明
提前至当前作用域的最上面
函数中的变量声明会提升至函数作用域最上方,不会出函数
console.log(num); //输出结果为undefined
var num = 10; //变量的声明提前了
预解析案例
1.
f1(); //不能调用
var f1 = function(){
console.log(a); //undefined
var a = 10;
};
2.
f2(); //undefined-可以调用
function f2(){
console.log(a); //undefined
var a = 10;
}