1.参数
js中分为形参和实参,形参是函数中的变量,实参是一个实际的数,是运行时函数调用的参数。
一、函数定义(function a(){ })
1.函数名称标识符(a)
形象的说就是函数的名字,便于我们后续调用,名字是可以随便取得(合法),但是最好定义和函数意义相同的名称,便于后期维护了解。
2.一对圆括号()
里面由0个或多个逗号隔开的标识符组成的列表,用来表示函数的参数名称,他们就像函数体中的局部变量一样(书中原话)。
3.一对花括号({ })
连包含js语句,这些语句构成函数体,调用函数就会执行这些语句。
4.函数可以赋给一个变量 var f = function fact(){ };
可以作为参数传给其他函数 data.sort( function(a,b) { return a-b } );
有时候会定义后立刻调用 var ten = ( function(x) { return x*x } (10) )
这些属于函数定义表达式,通常而言,以表达式方式定义函数一般不需要名称,这会让定义他们的代码更为紧凑,这种特别适合那些之调用一次的函数。
5.命名
5.1 取描述性强又简洁的函数名
5.2 通常以动词或以动词为前缀的词组
5.3 第一个字符小写
5.4 单词与单词之间用下划线分割
5.5 除了第一个单词的首字母小写,其他的首字母都大写
6.嵌套函数
js中函数可以嵌套在其他函数中,嵌套函数可以访问嵌套他们(或多重嵌套)的函数的参数和变量。
ps:function a(b,c){ function d( e,f){ } },函数d可以读写a中的b,c;这是这是函数作用域规则
以语句声明定义的函数有个限制:就是不能出现在循环语句,条件判断,或者try/cache/finally以及with语句中,(ps:有些js实现并没有严格遵守这个规则)
二、函数调用
1.函数调用的四种方法
作为函数
作为方法
作为构造函数
通过call()和apply()方法间接调用
2.参数和返回值得处理
2.1 参数
在一个调用中,每一个参数表达式都会计算一个值,计算的结果作为参数传递给另外一个函数,这些值作为实参传递给声明函数时定义的形参。在函数体中存在一个形参的引用,指向当前传入的实参列表,通过他可以指向当前传入的的实参列表。
2.2 返回值的处理
对于普通的函数调用,函数的返回值成为调用表达式的值;如果函数返回是因为到达结尾,则返回值就是undefined;如果函数返回是因为遇到了return,则函数返回值就是return之后表达式的值,如果return语句没有值则返回undefined;
(ps:this可以用来当前脚本运行时,是否为严格模式)(ps:脚本类似于一个封装的函数,类似于生活中的剧本,是使用脚本语言编写的,自己的理解)
3.方法调用
例如:有一个函数f和一个对象o;则可以给函数定义一个名为m()方法,o.m = f ; 调用时 :o.m() ; 如果m()需要两个参数则 o.m(x,y); (ps:函数表达式本事就是一个属性访问表达式)
方法和this关键字是面向对象编程范例的核心!!!
(this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(大部分情况是正确的,但是有时不能这样理解)
情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window
情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
this的值是随着调用变化的,我百度了一个介绍this的网页 https://www.cnblogs.com/pssp/p/5216085.html 想多了解的可以去看看。)
3.1 函数调用一般用点符号来访问属性,使用方括号也能进行(属性访问表达式),
例子:o[ "m" ](x,y); //o.m(x,y)另一种写法;a[0](z) //同样是一个方法的调用(这里假设a[0]是一个函数);
复杂的例子:customer.surname.toUpperCase(); //调用customer.surname的方法 ;f().m(); //在f()调用结束后继续调用返回值中的方法m();
3.2 方法链
当方法的返回值是一个对象,这个对象还可以再调用他的方法。这种方法调用序列中(通常称为“链”或“级联”)每次调用结果都是另外一个表达式的组成部分。
$(":header").map(function() { return this.id }).get().sort(); //找到所有的header,取得他们id的映射,转换为数组并对他们进行排序;
链式调用:这种编程风格只要指定一次要掉用的对象即可,余下的方法都可以基于此进行调用;(当方法不需要返回值时,最好直接返回this)
注意:不能给this赋值
4.构造函数调用
4.1 函数或方法调用前带有关键字new,就构成 构造函数 调用。
如果构造函数没有形参可以省略实参列表和圆括号:var o = new Object(); 等价与 var o = new Object;
4.2 构造函数通常不使用return,
5.间接调用
一般是使用call()和apply()具体后面再说。