在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下:
1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内存地址,这也就是所谓的引用类型
例如:Java中创建一个Person类,存在一个name属性
Person p1 = new Person();
Person p2 = p1;
那么会有p1和p2指向同一块内存地址,可以验证,假设对p2做赋值操作: p2.setName("xxx"),那么p1.getName()也会相应的被设置为"xxx",
js中的对象和Java中的对象在此一致
例如:js中
var u1 = new Object();
var u2 = u1;
u1.name="xxx";
alert(u2.name); //这里呈现的结果也是xxx
2,但是对于js中函数而言,却不是如上的结果,这也就是上面提到的js的函数是一个对象,但是和对象的区别
举例: var fn1 = function(){
alert("hello fn1");
}
var fn2 = fn1;
fn1 = funtction(){
alert("变化后的fn1");
}
fn1();//结果是: 变化后的fn1
fn2();//结果是: hello fn1
这个区别的原因要去分析内存模型: 对象是通过指向内存中的一块区域来完成对"引用"的指向, 函数是通过拷贝一块新的"引用"然后指向它来完成的指向
JavaScript中定义函数的方式:共有三种
第一种方式:
function 函数名(){
函数体;
}
第二种方式:
如下是函数的定义
function fn1(){}
在这里重新定义了一个变量fn2指向了fn1
var fn2 = fn1
fn1 = function(){
alert("aaa");
}
fn1();//值已经变了
fn2();//发现没有改变
如下是对象的定义
var o1 = new Object();
var o2 = o2;
o2.name = "aa"
alert(o1.name)://发现o1的name值也会改变
在这里就要提一下重载(首先声明: 函数在js中没有重载)
上例子:
function sum(num1,num2){
return num1+num2;
}
function sum(num1){
return num1+100;
}
sum(10);//结果毫无疑问: 110
sum(50,50);//结果是多少呢? 神奇的事情: 不是100,而是150
原因:
var sum = function(num1,num2){ return num1+num2}
var sum = function(num1){return num1+100}
函数是对象,不存在重载,只存在覆盖,后面定义的,会覆盖前面定义的(这里就是出现上面神奇现象的原因)
有的童鞋要问,我传入的是两个参数的时候,既然,后面的函数覆盖了前面的函数,也就找不到匹配参数个数的函数了,为什么不报错呢?
函数的参数和调用没有关系, 如果函数只有一个参数,但是却传入了两个参数,仅仅只会匹配一个,多传了JS就当没有看见
函数的第三种定义方式
var o = new Object();
var fn = new Function(参数1,参数2,...,参数n,函数体);
var fn = new Function("num1","num2","alert(num1+num2)");
如上方式等于
function fn(num1,num2){
alert(num1+num2);
}
通过这个例子,说明函数就是一个对象
注意,一定要多思考相应的内存模型: 函数的内存模型在内存中就是一个键值对
欢迎和小马哥一起交流:413939157(技术交流) 随便问问题