一、函数声明和函数表达式有什么区别
函数声明:函数声明必须有函数名,函数可以在任意地方调用。
函数表达式:前后两个函数的名字可以相同也可以不相同, function 后面的这个名字是可以省略的 , function 后面的这个名字只能再函数内部使用 ,函数调用只有在函数表达式声明后调用。
二、什么是变量的声明前置?什么是函数的声明前置
当执行流进入一个作用域后,作用域里面的函数和变量会被提升到作用域顶部预先解析,此时变量被赋值为undefined,变量真正的值不会提升,函数则是整体被提升,确保所有代码执行之前已经全部被解析,无论在哪里调用此函数都会执行。如下所示
a(); // a
console.log(b); // undefined
function a(){
console.log("a");
}
var b="b";
console.log(b); // b
三、arguments 是什么?
arguments 是一个对应于传递给函数的参数的类数组对象。arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。如下代码:
function a(){
console.log("名字:"+arguments[0]); //名字:小明
console.log("年龄:"+arguments[1]); //年龄:22
console.log("性别:"+arguments[2]); //性别:男
console.log("传进的参数有几个:"+arguments.length+"个"); //3个
}
function b(name,age,sex,achievement){
console.log("name:"+name); //name:小红
console.log("age:"+age); //age:21
console.log("sex:"+sex); //sex:女
console.log("achievement"+achievement) //achievement:A+
console.log("传进的参数有几个:"+arguments.length+"个"); //4个
arguments[0]="小青"
console.log("名字被改为"+name+"了"); //名字被改为小青
}
a("小明","22","男");
b("小红","21","女","A+")
四、函数的"重载"怎样实现
js中没有重载! 同名函数会覆盖。 但可以在函数体针对不同的参数调用执行相应的逻辑。
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
第一次调用时,没有sex参数,函数内的sex参数被赋值为undefined,if的判断里面的undefined,被转换为false,里面的代码不会被执行,所以实现了"重载"。
五、立即执行函数表达式是什么?有什么作用?
- 立即执行函数表达式是什么
定义一个函数后,立即调用这个匿名函数;它还有多种写法:
(function(){alert('立即执行函数')} ()) // 用括号把整个表达式包起来
(function(){alert('立即执行函数')}) () //用括号把函数包起来
!function(){alert('立即执行函数')}() // 求反
+function(){alert('立即执行函数')}()
。。。等等
- 作用:
① 是不必为函数命名,避免了污染全局变量;
② IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。