1.函数是对象,函数名实际上是函数对象的指针
1、函数声明方式 (函数声明提前)
function sum(num1,num2){
return num1+num2;}
2、函数表达式
var sums = function(num1,num2){
return num1 + num2;}
3、构造函数方式
var summs = new Function("num1","num2","return num1+num2");//不推荐 用来理解 “函数是对象,函数名是指针”
2.因为函数名是指针,所以可以理解js中没有重载的概念(函数重载)
function aa(num){
return num + 100;}function aa(num){ return num + 200}var result = aa(100);//300
在声明了两个同名函数,而结果是后面的函数覆盖了前面的函数
3.函数声明和函数表达式的不同
实际上,解析器在实行环境中加载数据时,对函数声明和函数表达式并非一视同仁,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须到等到解析器执行到它所在的代码行,才会真的被解释实行。
- 函数声明方式 js引擎会先将函数声明提前到顶部
alert(sum(1,2));//正常执行
function sum(num1,num2){ return num1+num2;}
- 函数表达式 //等价的函数表达式,js会从上到下执行,也就在弹出框时找不到函数表达式而报错,执行不了下面的代码
alert(sum(1,3));//报错
var sum = function(num1,num2){ return num1 + num2;}
注意:除了什么时候可以通过变量访问函数这一点区别,函数声明和函数表达式的语法其实是等价的
形参和实参
形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
实参:可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参
function funct(a,b,c){
return b;}
- 个数问题
funct('a');//正常
funct('a','b','c','d');//正常funct();//正常
如果形参为三个,但实参值传进一个,正常运行,
如果形参为三个,但实参传进了四个,正常运行,如果形参为三个,但实参没有传值,正常运行因为:在js里面,函数的形参是不介意你传递的是什么东西,也不在乎你传递的内容的数据类型,无论你传多少个,甚至不传,解析器也始终不会抱怨。
传参的内容,会以数组的形式表示,函数接收时,始终接收的是这个数组,如果数组里面有参数,它不需要理会数组中的数据类型
function a(){
console.log(arguments[2]);//cconsole.log(arguments[1]);//bconsole.log(arguments[0]);//aconsole.log(arguments.length);//3console.log(typeof arguments);//obj}a('a','b','c');
arguments对象,实际上,只是个类似数组而已,(它并不是Arrary的实例),它可以用[]来访问它里面的每个元素,也能使用length属性来确定参数的多少,arguments对象的长度是由传入的实际参数个数决定的,而不是由定义函数时命名形式参数个数决定的。
2.参数的类型问题
- 基本数据类型
- 在函数中给形参传递基本数据类型时,就是把值复制一个给局部变量,也就是arguments对象中的一个元素
- 如果num是按引用传递的话,那么变量count的值会变成30.但num在函数内部的运算没有影响到函数外部的count变量,所以num和count之间是不认识的,他们仅仅是数值上的相同。(以下代码)
-
function addTen(num){
num += 10;return num;}var count = 20;var result = addTen(count);console.log(count);//20console.log(result);//30
- 引用数据类型
- 在这个函数中,变量person保存的是一个obj对象,在变量被传递到setName()函数中后备复制到obj,但在函数内部,obj和person引用的是同一个对象,,所以,在函数内部所创建了对象的属性,在函数外部也能访问。(以下代码)
- function setName(obj){ obj.name = 'Name';}var person = new Object();setName(person);alert(person.name);//Name
不断总结,才能熟悉,掌握知识,但若想往高处走,还是得从书中获取知识,从实践中获取经验。花点时间,读本好书O(∩_∩)O~~~
(完)