一、函数基本知识
1、function:函数->具备某个功能的一个方法。方法本身是没有什么意义的,只有执行这个方法实现了对应的功能才有自己的价值。
2、函数由两部分组成:创建一个函数、执行这个函数
function 方法名(){
//函数体:存放的某个功能实现的JS代码
}
方法名();
创建一个函数可以执行多次,一般情况下,每次执行函数和上一次执行没有任何的关系
function sum(){ var total = null; total = 1 + 1; console.log(total) }
sum// 后面不加小括号,代表的就是当前函数本身 sum(); //sum后面加小括号,代表的是执行当前函数 函数执行的目的:把函数之前存储的那些字符串 变成js代码,
然后在让js代码从上到下的执行。
创建一个函数的过程:
1)、首先开辟一个新的内存空间,浏览器为其分配一个16进制的地址,我们假设地址为:xxxfff000
2)、把函数体中的JS代码当做"字符串" 存储到内存空间中。
3)、再把这个地址赋值给当前的函数名 sum->xxxfff000
函数执行的过程
1)、函数执行的时候,首先会提供一个供函数体中代码执行的环境->私有作用域
2)、把函数体中的代码字符串变为代码从上到下执行
注意:函数在执行的时候,首先会形成一个新的私有作用域,供函数体中的代码从上到下执行,形成的那个私有作用域,把我们函数体中的代码都包起来了,保护里面的私有变量,不受外界的干扰,我们把函数执行的时候形成的这种保护机制叫做"闭包"
二、形参
扩展:我们想把sum这个方法升级,随便给我两个数都能求和 ->形参
function sum(num1,num2){//num1和num2 就是我们设定的形参“变量” 是当前函数的两个入口 var total = null; total = num1 + num2; console.log(total) } sum(100,200);//执行的时候 只需要把对应形参的值传递给函数即可 sum(10) // num1 = 10 num2 = undefined 没有传递的形参默认是undefined
三、return
在函数里面return 就是当前函数提供给我们的出口,因为不提供出口的话,闭包的机制导致了在函数体的外面
无法获取里面的值,如果想在外面使用里面的值,值需要通过return 把total的值返回到外面即可--》“返回值机制”
外面想用哪个值,我们就把哪个值返回 ->return total ;并不是把变量返回给外面,而是把变量存储的值返回给外面
var total = sum(100,200) // 首先把函数sum执行,然后把sum执行后的返回值(看sum执行的返回结果,只需要看sum中是否存在return,有return,return后面返回的值是什么,那么函数的返回值就是啥;如果sum中没有return 那么默认的返回值是undefined)赋值给外面的变量total
在函数体中return 下面的代码都不会执行了 ->终止函数体中代码执行的作用
四、arguments
"任意数求和":随便给我几个数(具体几个不知道,就没有办法定义形参的个数),我都能求出和
arguments:函数天生自带的(不管写没写形参,也不管是否传递值,arguments始终都是存在的),用来接收函数传递进来的参数值的集合
typeof arguments // object 它是一个对象数据类型的值,它是以数字作为索引,索引从零开始逐级递增,索引0存储的是第一个参数,索引1存储的是第二个参数值,索引n存储的是第n+1个参数值。。。有一个叫做length的属性代表一共传递了多少个参数; 它不是数组,我们把它称之为类数组
callee:function sum ()... 它还有一个自己特殊的属性callee,代表当前函数本身
function sum(){ var total = null; for(var i = 0;i<arguments.length;i++){
var cur = Number(arguments[i])
//对于非有效数字我们不在进行累加,防止最后结果是NaN
if(isNaN(cur)){
continue;
}
total+=cur; } return total; }
五、匿名函数
实名函数:起了名字的函数就是实名函数
匿名函数:没有名字的函数 就是匿名函数
在js中常用到的匿名函数有两种方式:
1)、自执行函数:定义函数和函数执行一起完成了
;(function(num){ 前面加;的作用是为了防止上面代码结束不加;
}(100))
2)、函数表达式:把函数定义的部分当做一个值赋值给一个变量或者元素的某一个行为
var f = function(){}
new 的过程
使用new关键字调用函数(new ClassA(…))的具体步骤:
1. 创建空对象;
var obj = {};
2. 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象;
obj.__proto__ = ClassA.prototype;
3. 使用新对象调用函数,函数中的this被指向新实例对象:
ClassA.call(obj); //{}.构造函数();
4. 将初始化完毕的新对象地址,保存到等号左边的变量中