• JavaScript面向对象(01)--函数


    在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(技术交流) 随便问问题
  • 相关阅读:
    git 强制覆盖本地
    .gitignore 配置
    Git fetch和git pull的区别
    时间函数 date strtotime
    page show
    prepare PDO
    Lucene搜索方法总结
    lucene索引日期和数字
    lucene 3.0.2 + 多文件夹微博数据(时间,微博)构建索引
    lucene 使用注意
  • 原文地址:https://www.cnblogs.com/hadoop2015/p/5037442.html
Copyright © 2020-2023  润新知