你的位置:首页 > Java教程

[Java教程]js中函数的一些理论知识

                                                                      函数的一些理论知识
 1. 函数: 
              执行一个明确的动作并提供一个返回值的独立代码块。同时函数也是javascript中的一级公民(就是函数和其它变量一样)。
 2.函数的声明方式: 
               1> 函数声明:在函数里,必须手动去声明函数的返回值,如果返回值没有申明,则此函数返回值为undefined,,return是函数内部使用的,形参能自动声明,而实参不能自动声明为undefined。我们在调用函数时要:函数+()这种形式。不然就是函数本身。function fn(){console.log("welcome");}
               2>函数表达式:例如var fun=function(){console.log("hello");}
               3>立即执行函数(IIFE):例如(function(){})()
               4>创建FUNCTION对象:例如 var func=new Function("one","two","return one+two");
                anguments:不是数组,却有数组的相关属性,是一个伪数组,类似元素集合,就算没有定义形参,一旦把实参传进函数,也可以访问到,例如:length。
 3.值传递和引用传递的区别: 
             1>值传递:声明的是原始的类型,具体的值,传给变量后,就与它本身没有关系了。
             2>引用传递:把地址传给变量,传完后变量的值会跟据变量的变化而变化 。
 4.可执行代码和执行上下文: 
             1>可执行代码:全局代码、函数代码、eval()代码(出于安全着想,一般不建议使用此类代码)
             2>执行上下文:执行代码的一个环境,环境会随着代码结束而结束,执行代码不断产生执行上下文环境。js中量声明给它的位置无关(变量提升),块作用域(js中没有这个作用域)
 5.变量和变量的初始化:

             当一个变量在声明时,就把变量存在变量对象中,变量对象(vo) #
             如果没有给一个变量定义却给它赋值,那变量就会成全局变量了。例如:a=b,前提又没有给a定义。
 6.作用域(链): 
              当一个范围里没有给这个变量定义时,我们就会上一层找,那么我们为啥函数能往上一层找啊?
              因每一个作用域对象中有一个vot和scope,而每一个scope保存上一层的vo(变量对象).scope对象是在函数声明时,它就已经存在了,是它所在的作用链的对象,
 7.this关键字:
              1>在一个函数中用this,一般把window
              2>当你的对象中再嵌套一个函数,此this指的是window,除非在对象中用一临时变量来保存this,那么此时的this就用临时变量替代,这时的this就指的是标签对象而不是window.

              3>如果我们以这种形式下的this就是反映对象本身了,例如:$("#aa").click(function(){})
8.call和apply关键字的区别:
              相同点:都可以改变thisr的指向。
              不同点:传参方式不一致。call是传的参列表。apply是传的数组。
9.闭合: 
             可以把局部变量持续保存。可以不在使用全局变量条件下用局部变量让变量一直保存。
             闭全满足的条件:1>在一个函数内部写一个函数,并访问局部变量 
                            2>这个函数可以被外部访问到(引用)
             闭舍的好处:持续保存,还会被其它引用。