含义介绍
- 类似于Java中的方法,目的是为了减少代码量和方便重复调用。
- funName(); 是调用的函数方法
- new FunName();是调用的构造方法。
- 对于函数有两种写法
- 声明:function nameF()
- 表达式: var nameF = function
JavaScript函数的参数
JavaScript是弱类型语言,一定要对参数进行判断。
<script>
function f1(a,b){
return a+b;
}
console.log(f1(1,2));//输出3
console.log(f1(1));//输出NaN,因为调用时形参b的值为undefined,无法进行计算
//对于参数来说进行判断,一般是空(undefined,null,0,空字符串,NaN)
//因为js中任何类型都可以转换成boolean类型,所以利用这个特性
//通过 if(!param) 语句可以过滤掉大部分参数,
//更简单的是 对于数字 var num = num || 0;
//对于字符串 var str = str || '';
//对于数组 var arr = arr || [];
//对于函数等,只好用typeof来判断,例如:
//if(typeof('afterClose')='function')
</script>
JavaScript函数没有重载
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function sum(a,b,c){
return a+b+c;
}
console.log(sum(1,2));//输出NaN
//js类似css,会覆盖,调用最后解析的函数,所以js里面不允许有重名的函数
//另外JS中的调用函数时参数可以随意写,不做限制,输出结果只跟函数体有关
console.log(sum(1,2,3,4));//6
</script>
变量/参数
-- 形参不影响实参的值
<script type="text/javascript">
var a = 20;
var b = 30;
function sum(a,b){
var a = 10;
return a+b;
}
console.log(sum(a,b));//40
console.log(a);//20
</script>
-- 不使用var声明的变量是全局变量,但是不推荐使用
-- 全局作用域只有一个,在script标签下就是全局,
-- 一个函数就是局部定义
对于浏览器解析js顺序
- 先进行预解析(找var function,param)
- 再进行从上到下,一行一行解析
<script>
//例如:
var num = 20;
fun();
function fun(){
console.log(num);//undefined
var num = 10;
}
//其实编译后,是这样的
/**
//全局
//第一次预解析
var num;
function fun(){
console.log(num);
var num = 10;
}
num=10;
fun();
//第二次预解析
var num;
function fun(){
//局部
var num;
console.log(num);//输出undefined
num = 20;
}
num=10;
fun();
*/
</script>
-- 看猜下面的结果
<script>
demo();
console.log(c);
console.log(b);
console.log(a);
function demo(){
var a = b = c = 10;
console.log(a);
console.log(b);
console.log(c);
}
</script>
--编译运行过程如下:
<script>
//编译后变化
functoin demo(){
var a;
a = b = c =10;//不使用var声明的是全局变量,a是局部变量,b和c是全局变量
console.log(a);//10
console.log(b);//10
console.log(c);//10
}
demo();
console.log(c);//10
console.log(b);//10
console.log(a);//a is not defined
</script>