函数的特殊点
今天主要总结了,之前遗漏的问题,函数的特色点
函数名、函数体、函数加载问题
1、打印函数名,等于打印了整个函数的代码
2、打印执行函数,等于打印函数的返回值
a)函数包含函数,先执行内部函数,在执行外部的
//函数名,就等于函数体 //执行函数,就等于函数体里面的代码+返回值 //打印函数名,等于打印整个函数体 console.log(fu); //打印函数执行函数,等于打印返回值 console.log(fu());//函数中包含函数,先执行里面的函数,在执行外面的函数 function fu(){ var arr=[1,2,3] }
4、js加载函数的时候,只加载函数名,不加载函数体,要想用内部成员,必须调用函数
函数的定义方法
1、第一种定义方法最强大,定义完毕后,在哪里调用都可以,无位置限制。
2、后面俩种方法是有局限性的,(调用函数必须在定义函数之后)
3、后俩种方法,直接变量名,就是函数执行名,直接在函数体下面调用
自定义方法
function fu1(){ console.log("我是第一种定义方法") }
匿名函数定义方法(函数声明时不起名,把函数赋值给一个变量的情况,成为匿名函数。)
var fu2=function(){ console.log("我是第二种定义方法") }
new function 函数定
var fu3=new Function("console.log('我是第三种定义方法')");
变量作用域
局部变量
1、只有局部能够访问的变量
2、函数内部用var定义的变量
3、函数执行完毕后,局部变量被回收
全局变量(成员变量)
1、在哪里都可以访问的变量
2、在函数内部,直接定义的变量不加var为全局变量,函数必须执行才可以使用
//函数只加载函数名,不加载函数体 var num3=111; //全局变量 function fu(){ //局部变量 var num1=222; //全局变量 //所以函数体的全局变量必须执行以后才可以在外部访问的到 num2=333; } fu(); // console.log(num1);//报错 console.log(num3); console.log(num2);
隐式的全局变量
function fu(){ //b和c是隐式全局变量 var a=b=c=1; //g和f是隐式的全局变量(分号相当于换行) var d=1;g=2;f=3; //w和e不是隐式的全局变量(逗号是用同一个变量,是局部变量) var q=4, w=5, e=6; }
预解析(js解析器在页面加载的时候)
1、首先查看语法错误
2、变量声明提升和函数整体提升
a)变量声明提升的时候,只提升变量名,不提升变量值
b)而function直接定义的方法是整体提升。
3、变量声明提升在函数内部照样使用
var aaa; console.log(aaa);//空,变量名提升,还没赋值 aaa=111; fn(); function fn(){ //空 不注释的时候,变量名提升,var aaa //函数的就近原则,那个变量离得近就用那个 console.log(aaa); var aaa=222; //用他自己的 }
案例题
f2();//结果:9 9 报错 9 9 9 console.log(cc); console.log(bb); console.log(aa); f2();//结果 前三个报错,999,因为函数执行之前还没定义变量 function f2(){ var a=b=c=9; console.log(aa); console.log(bb); console.log(cc); }
//需求:封装一个函数,求斐波那契数列的n项 function fu(num){ var num1=1; var num2=1; for(var i=3; i<=num; i++){ var eype=num2; num2=num2+num1; num1=eype; } return num2; } console.log(fu(12))