JavaScript 函数的使用
一、函数:
1.函数的定义:
function 函数名(var1, var2, ....,varX) {
// 函数体
}
2.函数的调用:函数名(1, 2, 3);
二、return的几种形式:
1. 当函数没有写return时,也会默认返回undefined
2. 如果return后面跟内容了,返回return后面的内容
3. 直接return返回,返回值为undefined;
4. 推荐的做法是要么让函数始终都返回一个值,要么永远不要返回值。
三、参数:
1、在Js中。实参的个数可以与形参的个数不一致。
2、当调用getSum的适合,会把实参的a、b 复制一份传递给getSum函数。
重载:方法的签名相同(函数的返回值、函数名称、函数参数),其他语言c++,java,c#都有方法的重载。
函数的名字相同,但是参数个数不同。
Js中没有方法的重载。下面的同名函数,会把上面的同名函数覆盖。在js中,不允许出现同名的函数。
function f1(a, b) {
return a + b;
}
function f1(a, b, c) {
return a + b + c;
}
三个参数的f1会把2个参数的f1覆盖,调用的是三个参数的f1.证明js中没有重载。
四、函数的两种定义方式:
1、函数声明
function f(a, b) {
return a + b;
}
console.log(f(a, b));
2、函数表达式:myFun与f等价。
var myFun = function(a, b) {
return a + b;
}
console.log(myFun(a, b));
两种方式的区别:
为什么先调用也可使用 函数声明的函数。但是不能这样调用函数表达式形式的函数。
console.log
五、函数的作用域:(全局作用域,局部作用域)
全局作用域:在任何位置都可以访问, 在<script>标签内部定义的变量。
局部作用域:在函数内部声明一个变量,只能在该函数内部使用。
当变量超出作用域之后,变量会被垃圾回收机制销毁。
全局变量,一直存在,除非浏览器关闭,变量才会被销毁。
不使用var声明的变量,为全局变量。
函数内部可以访问到改函数所属的外部作用域的变量。
JavaScript中没有块级别的作用域。块内{} 声明的变量,都是全局变量。
if(true) {
var name = "abc";
}
console.log(name); // 可以访问到name变量。在其他语言中,是不可以这么访问的。
六、例子
var num = 10;
fun();
function fun(){
console.log(num);
var num =22;
}
解析
1、预解析,全局作用域预解析。
// 先找var、function和参数
// 找到var和function后,会把var和function声明 提前到<script>标签下。
num = 10;
fun();
2、解析一行,执行一行. 从上到下执行代码。
执行到fun后,进入局部作用域
预解析
// num
从上到下一行一行执行代码。
七、函数提升
1、变量提升
-定义变量的时候,变量的声明会被替身到作用域的最上面,变量的赋值不会提升。
2、函数提升
-js解析器会首先吧当前作用域的函数声明提前到整个作用域的最前面。
八、匿名函数
没有命名的函数:一般用在绑定事件的时候。
语法:function{}
自调用函数:
// 匿名函数的使用(自调用函数),只能执行一次 。可以避免变量命名的冲突。
(function() {alert ("hello world")}) ();
var myFun = function () {}
(function () {
console.log("test");
}) ();
======================================
九、Function作为参数传递。
1、函数是一种数据类型 function
2、函数可以作为另一个函数的参数。函数也可以作为另一个函数的返回值
function getResult(a, b, fn) {
// fn(a, b);
return fn(a, b); // 使用传递进来的函数
}
var result = getResult(5,6, function(a, b) {
return a + b;
// console.log(a + b);
});
console.log(result); // 值为undefined
3、eg 例子:
function f1(a, fn) {
fn(a); // 使用传递进来的函数
}
var n=5;
var myFun = function(a) {
console.log(a);
};
f1(n, myFun); // myFun不能带括号