JavaScript函数
前言
本篇详细介绍各种函数,与初步认识作用域。一、认识函数
函数是一个功能体,提供若干个数据,返回处理结果。
它由函数声明和函数体组成,函数体就是封装的重复执行的代码;创建函数以后,函数体的代码不会执行,函数每调用一次,代码才会执行一次。
例:
function 函数名称 (参数列表) {
函数体
return 值;
}
函数有两种写法:
1.命名函数表达式:var test=function (){函数体},函数就是另一个类型的变量,但这样写就不会函数声明提前。并且函数名会被忽略。
2.匿名函数表达式:function test(){}
函数名符合小驼峰原则。
结束条件和返回值 return,return 有终止函数的功能。
没写 return,实际上是加上了一个隐式的 return,并返回undefined。
JavaScript函数中天生不定参,形参可以比实参少或多。
每个函数都有实参列表arguments,与形参是映射关系,但又是两个独立的内存。只有形参和实参对应上才有映射关系。
形参长度:函数名.lenght,实参长度:arguments.lenght。
在这里提一下函数的递归
递归:
function mul(n){
if(n == 1 || n == 0){
return 1;
}
return n * mul(n - 1);
}
写递归的步骤:
1 找规律,
2 找出口(找停的点)
递归的优点是代码简洁,缺点慢
二、函数的种类
1.立即执行函数
定义:此类函数没有声明,在一次执行过后即释放(被销毁)。适合做初始化工作。
立即执行函数的两种写法
一(function (){}()); //在 W3C 建议使用这一种
二(function (){})();
针对初始化功能的函数:只想让它执行一次的函数
立即执行的函数也有参数,也有返回值,有预编译。
只有表达式才能被执行符号执行
能被执行符号执行的表达式,这个函数的名字就会被自动忽略(放弃名字)
能被执行符号执行的表达式基本上就是立即执行函数。
+function test(){}
函数前同样放了正号,负号,!就会放弃函数名字,转换成表达式;但是*和/不行,&&||前面放东西也行
2.构造函数
系统自带的构造函数 Object()
new Object();Array();Number();Boolean();Date();
自定义:必须用 new 这个操作符,才能构造出对象,构造函数必须要按照大驼峰式命名规则,但凡是构造函数就要大写。
构造函数有 new 了以后就不能返回原始值
构造函数内部原理
前提必须要加 new,new的作用就是以下三步,而且都是隐式的:
1.在函数体最前面隐式的创建 var this = {} 空对象,this._ _ proto _ _指向函数的原型对象prototype
2.执行 this.xxx = xxx;
3.隐式的返回 return this
3.包装类
new String();new Boolean();new Number();
用在原始值上,原始值不能有属性和方法,但经过了包装类(加隐式)可以调用一些属性和方法:
var num = 4;
num.length = 3;
//系统隐式的加上 new Numb
er(4).length = 3; 然后删除 delete
console.log(num.length);
//系统隐式的加上 new Number(4).length; 但是这个 new number 和上面的 new number已经不是同一个了,所以返回 undefined
而上面这些隐式的过程就是包装类
所以字符串的length可求。赋值无效。数组length可赋值截断数组。
undefined和null不可以有属性,会直接报错。
初识作用域
作用域定义:
函数外面不能用函数里面的。里面的可以访问外面的,外面的不能访问里面的,彼此独立的区间不能相互访问
window就是全局的域,document是HTML文档的根节点,可通过window.document访问。