全局函数
全局函数会压入window对象中,可能会覆盖了window里面的方法
console.log(window.screenX); //2200
function screenX() {
return "xcxxx";
}
console.log(screenX()); //xcxxx
使用let/const时不会压入 window
let hd = function() {
console.log("xxxx");
};
window.hd(); //window.hd is not a function
匿名函数
函数是对象所以可以通过赋值来指向到函数对象的指针,当然指针也可以传递给其他变量,注意后面要以;结束。下面使用函数表达式将 匿名函数 赋值给变量
let xx=function(){
console.log('匿名函数');
}
具名函数
具名函数可以 使用在声明的上面,而匿名函数不行,Js在解析代码的时候会把具名函数提升到上面,所以可以这样
xx()
function xx(){
console.log('具名函数');
}
函数中的变量提升
标准声明的函数优先级更高,解析器会优先提取函数并放在代码树顶端,所以标准声明函数位置不限制,所以下面的代码可以正常执行。
var xx=function(){
console.log('匿名函数');
}
function xx(){
console.log('具名函数');
}
xx()//匿名函数
xx() //具名函数
var xx=function(){
console.log('匿名函数');
}
function xx(){
console.log('具名函数');
}
function xx(){
console.log('具名函数');
}
var xx=function(){
console.log('匿名函数');
}
xx()//匿名函数
arguments
arguments 是函数获得到所有参数集合,下面是使用 arguments 求和的例子,是函数里面自带的对象
function sum() {
return [...arguments].reduce((total, num) => {
return (total += num);
}, 0);
}
console.log(sum(2, 3, 4, 2, 6)); //17
更建议使用展示语法来接收所有的参数
function sum(...args) {
return args.reduce((a, b) => a + b);
}
console.log(sum(2, 3, 4, 2, 6)); //17
递归
//阶乘
function factorial(num){
if(num==1)return 1
else return num*factorial(--num)
}
console.log(factorial(5));
//累加
function add(...arg){
if(arg.length==0){
return 0
}
else
return arg.pop()+add(...arg)//这里需要展开,不然就变成了多维数组了
}
console.log(add(1,2,3));
//简化写法
function add(...arg){
return arg.length>0?arg.pop()+add(...arg):0
}