在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. android 更改avd路径

    第一种方法,适合还没有建立 AVD 的情况 即:在计算机右击的属性 选择环境变量,然后添加一个用户的环境变量,名字为 "ANDROID_SDK_HOME”,然后把变量值改为你想将" ...

  2. windows服务异常值framework版本

    sc query WCService | find /i "state"if %errorlevel% == 0 ( net start "WCService" ...

  3. dataTables表格分页排序等交互

    官网: https://www.datatables.net/ 中文参考网站: http://datatables.club/ datatables+bootstrap示例: http://sandb ...

  4. leetcode:Reverse Linked List II

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  5. ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, or not known

    今天 git push 的时候报如下错误: ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, o ...

  6. python练习程序(c100经典例14)

    题目: 将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. def foo(n): while 1: for i in range(2,n+1): if n%i==0: print ...

  7. 【C#学习笔记】网页弹出提示框

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. Centos移除图形界面

    在此之前为了试验SAS Linux,在一台centos服务器上安装了desktop界面, 目前需要删除这些界面组件,可以按照以下步骤实现: 1. yum grouplist查看安装的组件 2. 使用y ...

  9. Shell 的source命令

    source命令用法: source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . ...

  10. Selenium2Library系列 keywords 之 _SelectElementKeywords

    # 公有方法 (1)get_list_items(self, locator)  返回labels集合 _get_select_list_options(self, select_list_or_lo ...