# Function
# 创建
Function
var fun = new Function(形式参数列表,方法体);// 括号里面的都必须是string类型。忘掉吧!函数声明
function 方法名称(形式参数列表){ 方法体 }函数表达式
var 方法名 = function(形式参数列表){ //匿名函数 方法体 }
方法定义时,形参的类型var不用写,返回值类型var也不写。
TIP
函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。
函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
# 属性
length代表形参的个数
# 无函数重载 & arguments
在JavaScript中,方法的调用只与方法的名称有关,和参数列表无关(传递多少个参数无所谓)
方法是一个对象,如果定义名称相同的方法,会覆盖(可以从对象引用理解),所以没有函数重载
在方法声明中有一个隐藏的内置对象(数组)
arguments,封装所有的实际参数。同Java中可变参数类似可以把传递的参数保存到
arguments数组里面来模拟函数重载var add = function(){ let sum = 0; for(let i = 0;i<arguments.length;i++){ sum+=arguments[i]; } return sum; }
# 默认参数
function hello(name = "world") {
console.log(name);
}
hello(); // world
hello(undefined); // world
hello(null); // null
hello("kitty"); // kitty
# 作用域
在函数内部定义的变量只能在函数内部使用,ES6之前主要的作用域就是函数,其他查看“作用域和闭包”章节。
函数内部变量与全局变量冲突则会覆盖全局变量
let 会在
{}中自动生成一个局部作用域,var 没有这个作用
# 箭头函数(匿名函数)
var add = (a, b) => {
return a + b;
};
var greet = name => {
console.log("hello", name);
};
var greet2 = name => console.log("hello", name);
console.log(add(1, 2)); // 3
greet("world"); // hello world
greet2("world"); // hello world
# 柯里化(curry)
function add(a, b, c) {
return a + b + c;
}
console.log(add(1, 2, 3)); // 6
// curry 就是将函数之前的值保存,缓存吗
function addCurry(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
}
var towAdd = addCurry(1)(2);
console.log(towAdd); // f
console.log(towAdd(3)); // 6
console.log(towAdd(4)); // 7
console.log(towAdd(5)); // 8
# 自执行函数
有自己的作用域
var num1 = 10;
(function() {
var num1 = 20;
console.log(num1); // 20
})();
console.log(num1); // 10
# 回调函数
function request(callback) {
console.log("请求数据");
callback("success");
console.log("请求结束");
}
// 可复用
// function callback(msg) {
// console.log("执行回调函数");
// console.log("执行结果是:" + msg);
// }
request(msg => {
console.log("执行回调函数");
console.log("执行结果是:" + msg);
});
← ES6 标准内置对象—Object →