一,初识函数
一个函数是js中一组执行任务或计算的语句。一个js函数用function关键字定义,后面跟着函数名和圆括号。
1.预定义函数
js语言有好些个顶级的内建函数:
eval() | 对一串字符串形式的js代码字符求值 |
isFinite() | 判断传入的值是否是有限的数值。如果需要的话,其参数首先被转换为一个数值 |
isNaN() | 判断一个值是否是NaN |
parseFloat() | 解析字符串参数,并返回一个浮点数。 |
parseInt() | 解析字符串参数,并返回指定的整数。 |
decodeURI() | 函数对先前经过 decodeURI 函数或者其他类似方法编码过的字符串进行解码。 |
decodeURIComponent() | 对先前经过encodeURIComponent函数或者其他类似方法编码过的字符串进行解码。 |
encodeURI() | 通过用多个转义序列表示字符的 UTF-8 编码替换统一资源标识符(URI)的某些字符来进行编码(每个字符对应四个转义序列,这四个序列组了两个”替代“字符)。 |
encodeURIComponent() | 通过用多个转义序列表示字符的 UTF-8 编码替换统一资源标识符(URI)的每个字符来进行编码(每个字符对应四个转义序列,这四个序列组了两个”替代“字符)。 |
2.自定义函数
一个函数定义依次为:函数的名称,函数参数列表,定义函数的js语句,用大括号括起来。
//函数声明
function fun(num){
num++;
}
//函数表达式
var ji=function(num){
num--;
};
3.预解析
预,就是提前,而预解析,顾名思义就是提前解析代码,在js中,代码都是一行一行按顺序从上往下执行的。预解析的出现打破了这一规则。预解析主要做了件事:把变量,函数的声明被提前了。
4.函数自调用
在自定义函数中,如果函数没有名字,如“functon (){}”,则被称为匿名函数。那么,匿名函数该如何调用呢?
(function (){
//函数体
})();
在上述代码中,将“function (){}”匿名函数放在一对“()"中,就实现了调用,它被称为函数自调用。
5.回调函数
function f1(fn){
console.log("f1函数被调用了");
fn();
};
function f2(){
console.log("f2函数调用了")
};
f1(f2);
在上述代码中,当调用f1()函数时,将f2()函数作为参数传入,运行时,首先输出“f1函数调用了”,之后输出“f2函数调用了”。
二,局部变量和全局变量
1.局部变量和全局变量的概念及使用
局部变量是在函数内部声明的变量(必须使用var),只有在函数内部访问它。其特点是可以在不同的函数中使用名称相同的局部变量。
作用域:局部变量仅作用在函数中,而全局变量作用于整个脚本。
声明位置:局部变量声明的位置在函数中,而全局变量可以声明在使用之前的任何位置。
生存期:局部变量在函数运行以后被删除,而全局变量在页面关闭后被删除。
2.隐式全局变量
如果变量声明时没有var,则被称为隐式全局变量。使用var声明的变量不会被删除,而没有使用var声明的变量可以被删除,delete 变量名。
三,作用域和作用域链
1.作用域和块级作用域
作用域(Scope)就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。块级作用域是由大括号限定的。
2.作用域链
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级执行上下文的变量对象中查找,一直找到全局上下文的变量对象,及全局变量,这样由多个执行上下文的变量对象构成的链表就被称为作用域链(Scope Chain)。
四,闭包
闭包是指有权访问另一个函数作用域中的变量的函数。主要分为两步:
1.在函数的内部,在定义一个函数。
2.把内部函数作为返回值。
闭包的作用主要有两个:
1.可以读取函数内部的变量
2.可以让这些变量的值始终保存在内存中。
缺点也有两个:
1.由于闭包可以读取函数内部的变量,所以闭包也可以在父函数外部改变父函数内部变量的值。
2.由于闭包会使得函数中的变量都被保存在内存中,所以内存消耗很大。
本章总结
胜人者智,自胜者强。不是成功离我们太远,而是我们坚持的太少