在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(技术交流) 随便问问题

JavaScript面向对象(01)--函数的更多相关文章

  1. JavaScript面向对象之函数构造器的理解

    1,在使用函数创建类时,函数本身也被称为该类的构造器,该类的构造器方法,该类的构造方法,该类的构造函数等等. 2,注意构造器方法是没有返回值的,当创建该类的实例时,必须调用该类的构造方法. 3,获取构 ...

  2. javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)

    defineProperty用于设置一个对象的属性描述符,属性描述符有4个:[[Configurable]], [[Enumerable]], [[Writable]],[[Value]] 当一个属性 ...

  3. javaScript系列 [01]-javaScript函数基础

    [01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...

  4. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  5. 02.JavaScript 面向对象精要--函数

    在JavaScript中,函数其实也是对象.是函数不同于其他对象的特点是:函数存在一个被称为[[Call]]的内部属性.[[Call]]属性是函数独有的,表明该对象可以被执行.ECMAScript 定 ...

  6. JavaScript面向对象—基本数据类型和引用数据类型的区别和变量及作用域(函数和变量)

    基本类型和引用类型的值 ECMAScript 变量可能包含两种不同的数据类型的值:基本类型值和引用类型值. 基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置. 而引用 ...

  7. JavaScript面向对象编程指南(三) 函数

    第3章 函数 3.1 什么是函数 函数:本质是一种代码的分组形式.函数的声明如下: <script type="text/javascript"> /*函数的声明组成: ...

  8. 19 01 12 javascript 定时器 封闭函数

    定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行一次的定时器 setIn ...

  9. JavaScript面向对象的三大特性

    1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...

随机推荐

  1. eclipse中启动tomcat报错 java.lang.ClassNotFoundException

    之前启动还好好的,某次启动tomcat就莫名其妙的报了这个java.lang.ClassNotFoundException的错.   检查maven依赖包,发现这个类是存在的. 然后一通clean操作 ...

  2. YTU 2617: B C++时间类的运算符重载

    2617: B C++时间类的运算符重载 时间限制: 1 Sec  内存限制: 128 MB 提交: 284  解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...

  3. 下拉刷新控件(4)SwipeRefreshLayout官方教程(上)如何在应用中使用它

    http://developer.android.com/training/swipe/add-swipe-interface.html 1,在布局xml和代码中使用它 2,在menu中添加它 The ...

  4. grep/awk/sed 或者 并且 否定

    Grep 'OR' Operator Find all the lines in a file, that match any of the following patterns. Using GRE ...

  5. ubuntu中apt-get安装与默认路径

    一.apt-get 安装 deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb或者直接双击此文件 dpkg 是Debian ...

  6. ORA-12154 终极解决办法

    PLSQL连接Oracle数据库总出现12514分2中情况: 1.无法解析指定的连接标识符: 解决办法:我的电脑---属性---高级---环境变量   删除Path变量中C:\oracle\produ ...

  7. 使用Jekyll搭建博客

    最近闲来无事,捣鼓了一下Git以及Github,尝试了一下基于Jekyll搭建个人博客的方法,现在把整个过程进行一个总结(部分内容转自互联网): <img src="http://up ...

  8. Java中数组复制的几种方法

    /** * @author zhengbinMac */ public class Test { public static void main(String[] args) { int[] arra ...

  9. 【转】使用Xcode和Instruments调试解决iOS内存泄露

    原文网址:http://blog.csdn.net/totogo2010/article/details/8233565 虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄 ...

  10. LoopBar – Tap酒吧与无限滚动

    相约 LoopBar – 标签栏与无限滚动为Android由Cleveroad 在Cleveroad我们最近认识到通过使用任何一个应用程序类别的导航,导航面板是很无聊和琐碎.这就是为什么我们的设计师的 ...