函数
本文于496天之前发表,文中内容可能已经过时。如有疑问,欢迎在github中给我留言(用户名:zhangyan123)。
函数
- 函数时对象,他的不同之在于可以被调用;
- 除了声明的形参之外,每个函数还接收两个附加的参数:this和arguments.参数this在面向对象编程中非常重要,他的值取决于调用的模式,在javascript中一共有4种函数调用模式:方法调用、函数调用、构造器调用、apply调用。
- 函数的参数使用逗号分隔,这些参数名称将被定义为函数中的变量,它们不像普通量那样被初始化为undefined,而是在函数被调用时初始化为实际提供的参数值。
- 函数声明的组成部分:关键字function、函数名、参数、函数体、return(如果没有显示的返回值,JS默认返回undefined)
- 函数声明与函数表达式区别在于声明会提升,而表达式在预编译中会被跳过,只有var a =function(){//函数体}中的变量a得到了变量声明提升,a===undefined;
- 函数的参数分为形参和实参,eg:function add(a,b){return a+b;} 中形参的个数为add.length,而使用时传入实参的个数为arguments.length,arguments是函数内建变量,它是一个承装实际参数的类数组而非真正的数组,一般为了方便使用数组的方法我们会使用var args=Array.prototype.slice.call(arguments);将类数组转换为真正的数组。
枚举JS内建函数注意事项
- parseInt(requireArg,radix)第二个参数用于指定解析整数的进制,默认十进制,ES5之前有fix=0x||0时候易造成默认进制改变为十六或八导致的错误。ES5已经修复了八进制的默认表示法,但是使用此函数时仍需注意,不能解析为整数时返回NaN。
- parseFloat()只支持解析为十进制数,但parseFloat()可以识别指数型字符串parseFloat(‘1e1’)===10
- isNaN()确定输入值是否为可参与计算的数字,因此此函数可以用来检测parseInt()和parseFloat()返回调用成功与否。
- isFinite()用于检测既非Infinit又非NaN的数字
- URI的编码与反编码 encodeURI()/encodeURIComponent()/decodeURI()/decodeURIComponent
函数的两大特征:
- 函数是对象,唯一的不同是它可以被调用;
- 函数定义局部作用域;
- 强烈建议使用“单一var”模式在函数顶部声明函数用的局部变量,方便已近函数遍阅读到该区域所有用的变量的定义。避免变量声明提升带来的变量使用不恰当的混淆问题。
- 将A函数作为参数传递给B函数,并由B函数来执行A(A承担B函数中的部分处理功能特别是在循环中调用同一种方法时常用回调函数节省循环次数),此时A函数叫做B函数的回调函数。
- 闭包实现:(将函数内部的函数暴露在全局环境中)
- return inner();
- 全局变量=inner();
使用闭包的注意事项:
- 内部函数保存的是作用域本身,也不是定义函数时的快照,因此在外调用内部函数时多次调用结果可以不同;
- 循环中使用闭包:要记住闭包记住的是变量而非定义闭包时的固定值,当调用闭包时其中的变量值为该变量最近被赋予的值;
- 闭包可以用于访问私有变量,保证该变量的值只通过闭包进行访问,并保证在全局可以访问到此变量。
每个函数都一定有return值,没有显示返回的js自动补全为undefined,return false为终止执行,return true为执行默认操作,可以return局部变量的值(栈中的值)或者函数(闭包),但不能返回局部引用值(引用的对象存储在堆中,函数返回之后堆中对象被清理,引用值体现为无效)。