函数知识点补充:
- 函数的参数的默认值
function fa(x=6){
console.log(x)
}
调用fa()时,本来需要传入一个参数,但没有传任何参数,此时上述函数就会使用参数的默认值。如果没有定义参数的默认值,也没有传参数,那么就是undefined。
-
写在if语句中的函数声明,在预编译阶段不会被提到上面,要在if语句执行之后,才会把这个函数提到上面。所以要在if语句执行之后,调用这个函数才有用。
在for语句中函数声明也是一样。 -
函数内部没有使用var 定义变量x,会把x转为全局变量。
但是这样会报错
console.log(x)
function fa(){
x=10;
}
先调用一遍fa(),才会把x转为全局变量。这样就不会报错
fa()
console.log(x)
function fa(){
x=10;
}
- 非匿名的立即执行函数
var foo=1;
(function foo(){
foo=10;
console.log(foo)
})()
console.log(foo)
立即执行函数里面打印foo函数;
外面打印1;
当JS解释器遇到了非匿名的立即执行函数时,会创建一个辅助的特定对象,然后将函数名作为这个对象的属性,因此函数内部才可以访问到foo,但这个值又是只读的,对它的赋值并不生效,并且外部的值也没有发生改变。
- arguments.callee
相当于函数本身,指向当前正在执行的函数
可以用来指定匿名函数自身。
函数的吊装(函数的提升)
1、
var a=1;
function b(){
a=10;
return;
function a(){}
}
b();
console.log(a)
打印结果将是1;
函数内部的a函数声明会提升到函数的最上面,a成为函数内的局部变量,所以外面的全局变量a就被覆盖了。
所以在函数外打印a将打印1
2、
function ba(){
console.log(x)
function x(){}
}
ba()
打印结果为x函数;
同案例1一样,函数内的函数声明x被提升到函数内的最上面,所以执行ba()时,打印x就将打印x函数。
3、
function da(){
console.log(x);
var x=function(){}
}
da()
打印结果为undefined
此结构同案例2类似,但是很不一样,函数内的函数表达式的值不会提升到函数最上面,在上下文的创建阶段,它只会提升这个变量,var x,但是没有给x赋值,赋值要等到执行阶段,执行这个赋值语句的时候才会发生。所以打印结果为undefined。
浏览器分两遍来处理Javascript代码:
1)浏览器分析所有的函数声明,并定义这些函数声明所创建的函数;
2)浏览器按从上到下的顺序执行代码,并定义函数表达式创建的函数。
4、
function ca(){
console.log(x);
var x=1
}
ca()
此案例同案例3一样。
5、
var x=20;
function x(){};
console.log(x)
打印20;
6、
console.log(x)
var x=20;
function x(){};
打印x函数
7、
function fa(x){
console.log(x);
var x=10;
}
fa(5)
打印5
8、
function fa(x){
var x=10;
console.log(x);
}
fa(5)
打印10;
函数内部定义的与形参同名的变量覆盖了形参。
9、
function fa(x){
console.log(x);
function x(){};
}
fa(5)
打印x函数;
同案例7的区分。
10、
function fa(x){
var x=10;
console.log(x);
function x(){};
}
fa(5)
打印10;
函数声明提升到最前,然后var x声明覆盖了函数声明。
11、
var a=0;
function fa(){
if(false){
var a=1;
}
console.log(a)
}
fa();
打印undefined;
if语句中的var a被提升到前面(没有赋值);不会使用全局变量a了。
但是永远也执行不到if语句中,所以就永远不能给a赋值,所以打印undefined。
12、
function fa(a){
console.log(a);
function a(){};
var a=10;
}
fa(100)
打印a函数;
函数内a的定义顺序
var a
var a=100;
var a=function(){};