js相关笔记(六)

1.函数就是方法,具有一定功能的代码块儿,用来重复执行的功能代码块儿,功能的复用性很强用到的地方比较多。


2.函数由 函数名 参数 返回值 函数体组成,函数也由 功能名 参数 返回值 功能 组成。


3.如果出现函数名相同的函数,后面的函数会覆盖掉前面的函数,所以javascript中不存在函数重载。


4.定义函数时给的参数叫做形参,也就是表面形式上参与功能实现的参数,调用函数是给的参数叫做实参,也就是实际参与功能实现的参数。


5.定义函数时设置参数是为了 增强函数的功能性,这样函数的功能更加灵活,同时也提高了交互性和拓展性,通过传递参数达到了与函数内部进行交互的可能,通过传递参数达到了在原来的功能下进行功能的拓展。


6.调用函数时,没有给实参的那个形参值,默认是undefined,undefined即表示未定义或未赋值。


7.函数的返回值其实是个半成品,需要对它进行二次加工,函数外部需要什么那么久可以在函数内部返回什么,只能有一个返回值。


8.函数体内使用return关键字来返回数据,但是如果不写return,那么就会默认返回 undefined,如果写了return 但是后面没有跟返回值,那么也会默认返回undefined,并且return关键字会终止函数继续向下执行,也就是切断函数。


9.三元运算符就是简单的if-else,所以简单的判断时就用三元运算符来实现,涉及到数学方面的运算时,首选是Math类,有返回最小值,返回最大值,四舍五入,随机数,向上取整,向下取整,多少次方,还有圆周率Math.PI,还有开放Math.sqrt(),都可以拿来用。


10.引用类型传递的是引用,所以当函数中的参数为数组对象的时候,在函数里面如果改变了那个数组对象参数里的元素中的值,那么原本的数组对象的元素中的值也会发生改变。


11.NaN表示无法进行运算,在和-Infinity进行比较的时候,NaN比负的无穷大还要小。


12.斐波那契数列,规律是 1、1、2、3、5、8、13、21、34、55、89、144,表面上看上去是除了前两个数字特殊以外,其它的数字都是前两位之和,虽然实际上 2 是由 第一个数和第二个数组成,然后 3 是 由 2 和 1 组成,但是 3 中的2 也是由前两个数组成,3 等于 第一个数加上第二个数 再加上第二个数,而5 等于 前两个数相加然后再前两个数相加 然后再加上第二个数,所以递归的规律是 

function recursionGetFBNCS(number){
            if(number==1||number==2){
                return 1;
            }
            return recursionGetFBNCS(number-1)+recursionGetFBNCS(number-2);
        }



13.使用console.log(fn);打印函数名就是打印你定义的整个函数,内部调用了toString方法,打印你定义的整个函数的代码。


14.函数定义的三种方式
◆function fn1(){console.log(fn1);}//直接定义
可以在任何位置运行函数,没有位置局限性
◆var fn2=function(){console.log(fn2);}//匿名函数赋值,只能在赋值完毕之后,在函数的下方可以运行这个函数,顺序从上到下,所以有位置局限性
◆var fn3=new Function("console.log(fn3);");//函数类的构造函数  只能是赋值完毕后,在下方才能够运行这个函数,顺序也是从上到下,也有位置局限性


15.全局变量与局部变量
◆变量的作用域 :根据作用范围 分为全局作用域和局部作用域,javascript中没有块儿级作用域。
◆局部作用域:只作用于局部,也就是在函数内部定义的变量,函数执行完毕之后就会被回收掉。
◆全局作用域:作用于全局,在哪里都能访问到的变量(在函数的外部或在进入javascript后立即定义的变量和函数内部定义时不带有var关键字的变量),只要这个javascript还在那么就会一直存在,当然如果你设置为null了,那么也会被回收掉,全局变量还有个名字,叫做成员变量,因为他们都是window对象的一个成员,都能够使用window.成员来使用。


16.函数加载的时候只会加载函数名,当你调用这个函数的时候才会加载函数体,预解析时,函数里面的变量属于局部变量,只会提升到函数体内部最上面,如果要在函数体内部访问全局变量的话,必须在调用函数时,那个变量已经赋值了,否则获取的就是undefined,如果在那个变量赋值之后调用函数,那么就可以获取到那个变量的值,这就说明了函数加载的时候并不会加载函数体,调用的时候才会加载函数体。


17.隐式全局变量
★【
function fn2(){
            var a=b=c=1;
            ☆在这里b和c是隐式全局变量  因为b和c并没有用var关键字 只是有在赋值而已,而a使用var关键字
            var d=1;e=1;f=1;
            ☆在这里 e和f都是隐式全局变量  因为 e和f并没有用var关键字,而d使用var 关键字
            var h= 1,i= 1,j=1;
            ☆在这里 h i j 都是局部变量,因为使用了var关键字 集体声明,所以全都是局部变量
        }



18.预解析就是在执行之前先简单快速的解析,这个解析并不会执行里面代码,只是会做如下几件事
◆ 先检查语法错误,哪一行出现了【语法错误】就会立即停止执行并且报错
◆ 然后将函数整体提升到最上面,只是 function fn(){...} 这样的函数提升到最上面
◆再 将所有声明的变量提升到最上面,只是变量声明提生,初始化赋值之类并不会提升,所以才会出现你看见的,在变量声明赋值之前打印这个变量时会输出undifined,如果这个变量真的不存在,那么就会最开始预解析检查语法错误的时候就留下标记,然后解析执行时直接报错。
★函数体里面也是是这样预解析的,函数体里面的属于局部,那么变量提升也是局部变量,并且只会提升到这个函数体的最上面,不会提升到函数体外面,因为外面是全局变量
☆但是函数体内部完全不使用var关键字的变量经过赋值之后,也会变量提升为全局最上面,但是只会在函数体加载的时候提升,其它时候不会提升
☆所以预解析也会分全局预解析和局部预解析。
◆解析的时候代码是从上到下解析执行的,所以在函数体内获取全局变量时要注意,在这个函数执行的时候,变量有没有被赋值,如果没有被赋值,那么在函数里面获取的时候就会是undefined。
◇所以加载函数的时候只会加载函数名,不会加载函数体,函数体只会在你执行这个函数的时候加载。


19.javascript声明多个相同的变量是可以的,但是变量的值获取,是采取就近原则,那个变量距离你更近,那么你获取这个变量的值的时候只会获取到它。


20.平级的函数,内部的局部变量互不干扰。

posted @ 2018-06-10 18:04  我叫贾文利  阅读(103)  评论(0编辑  收藏  举报