前言
JavaScript中函数定义基本分3种方式:函数声明,函数表达式,构造函数。
函数声明
函数声明使用function 关键字, 格式如下
function 函数名称([参数]) {
// 执行代码
}
函数声明后,它不会自己执行,需要调用才会执行,调用函数使用函数名称加括号,如
function fun1() {
// 执行代码
console.log('hello')
}
// 调用函数
fun1() // hello
function fun1() {
// 执行代码
return 'hello world'
}
// 调用函数
var r = fun1() // 获取函数返回值
console.log(r)
函数声明提升
之前学习变量的时候,学到一个词:"声明提升",函数声明也会被提升。
"hoisting(声明提升)":函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
var r = fun1() // 获取函数返回值
console.log(r)
// 函数声明会被提升
function fun1() {
// 执行代码
return 'hello world'
}
函数声明的名称fun1会被提升到最顶部,所以上面代码不会报错,一般习惯上我们是先声明函数后调用。
函数表达式
我们可以在var 定义一个变量的时候,给它赋值一个函数,function声明的函数后面没有函数名称,这实际上就是匿名函数。
将匿名函数赋值给一个变量就是函数表达式
var 变量 = function([参数]) {
// 执行代码
};
使用示例
var fun2 = function () {
return 'hello world'
};
console.log(fun2()); //hello world
需注意的是var的变量可以提升,函数表达式不会提升
console.log(fun2); //undefined
console.log(fun2()); //Uncaught TypeError: fun2 is not a function
var fun2 = function () {
return 'hello world'
};
上面代码直接调用函数会报错Uncaught TypeError: fun2 is not a function
var person = {
firstName: "John",
lastName: "Doe",
address: function () {
// do something...
return '上海市'
}
};
a = person.address();
console.log(a); // '上海市'
Function 构造函数
使用new Function()
构造函数
var 变量 = new Function('x', 'y', 'return (x+y)');
使用示例
// 构造函数
var fun3 = new Function('x', 'y', 'return (x+y)');
console.log(fun3(2, 3)) //5
function fun3(x, y) {
return x+y
}
console.log(fun3(2, 3)); //5
在 JavaScript 中,很多时候,你需要避免使用 new 关键字。
方法覆盖
当有2个相同名称的函数,但是传参不一样,JavaScript 中没有重载,python中也没有重载, java中有重载
在一个java类中,定义多个同名的方法,如果方法名相同,方法参数不同,包括参数的类型和个数都不同,叫做方法的重载。调用重载方法时,Java 编译器通过检查调用的方法的参数类型和个数选择一个恰当的方法。
function fun4() {
return 'hello'
}
function fun4(x, y) {
var s = x + y
console.log(s)
return 'hello world'
}
console.log(fun4()) // hello world
console.log(fun4(2, 3)) // hello world
重名的函数后面的会覆盖前面的。