JavaScript - 函数相关知识点

函数内部的隐藏参数 --> arguments ( 重点 )

arguments:接收实参

  • 该参数是一个类似于数组的结构(可以像数组一样遍历 + 还可以使用下标来访问数据),但是并不是数组。
  • 函数调用的时候,会把实参的值赋值给形参,而且会使用arguments来接收实参
  • 如果实参的个数超过形参的个数,那么可以通过arguments来获取超出的数据
  • 如果实参的格式小于形参的个数,那么不足的全部设置为undefined

this指向的是一个对象,具体指向的是哪个对象由函数调用方式来决定。总之,this是面向对象里面最让人蛋疼的一个东西

  • 使用this会让我们的代码灵活
  • 函数以普通方式调用:this指向window(注释:在非严格模式下指向window) 严格模式是 : use static
  • 以对象的方法来调用:this指向调用方法的对象
  • 以构造函数的方式来调用 :this指向的是构造函数内部新创建的对象
  • 上下文的方式调用(call|apply): 第一个参数

length属性

1.arguments.length 实参长度(个数)
2.函数名.length 形参的长度(个数)

  • 示例代码1 :
<script>
    //1 扩展内置对象
    Array.prototype.des = "描述信息";
    var arr1 = new Array();
    console.log(arr1.des);

    //2 怎么判断一个对象的类型
    //typeof
    // 字符串|数字基本数据类型  string /number /boolean
    //函数  function
    //数组 | 日期类型     --->object
    //判断数组:Array.isArray()

    //3 toString判断

    function sum()
    {
        var result = 0;
        for (var i = 0; i < arguments.length; i++) {
           result += arguments[i];
        }
        console.log(arguments.des,"______________");
        console.log(Array.isArray(arguments));   //false
        console.log(result);

        //数组  [object Array]?
        console.log(Object.prototype.toString.call(arguments));   
        //不是数组  [object Arguments]
    }

    sum(1,2,3,4,5);   // 3
</script>
  • 示例代码2 :
<script>
    function demo(a,b,c){
        // 打印用户传入的参数的个数
        console.log(arguments.length);
        //abc ===> 123
        //4和5可以拿到
        console.log(arguments[demo.length],"+++");
        console.log(c);
        //a =1 b = 2 c = undefined
    }
    demo(1,2,3,4,5);
    console.log(demo.length);
    demo(1,2);
</script>
  • 示例代码3 :
<script>

    //"use strict";
    var obj = {name:"电话情缘1"};
    var obj2 = {name:"电话情缘2"};
    function showName(){
        console.log(this);
    };

//    obj.showName = showName;
//    obj2.showName = showName;
//    obj.showName();
    showName();
</script>

callee和caller

callee : 函数自身
  • 主要用途:递归
  • 递归的特点:
  • 自己调用自己
  • 要有退出条件 不然就会陷入死循环
caller : 调用函数的函数 注意点:在全局作用域中调用,指向的是null
  • 示例代码1 :
<script>
    function demo1(){
        console.log(demo1.caller);   //demo2这个函数
    }

    function demo2(){
        demo1();
    }

    demo2();
    demo1();
</script>
  • 示例代码2 :
<script>
    function func(){
        console.log(arguments.callee);  //函数自身
    }

    func();
</script>
  • 示例代码 :
<script>
  //1 - 2: 1+2
  //1 - 3: 1+2+3
  //1 - 4: 1+2+3+4
  //1 - 5: 1+2+3+4+5
  //1 - 6: 1+2+3+4+5+6
  //1 - n: 1+2+3+4.....n  ==>1~(n-1) + n

  console.log((function (n) {
      if (n == 1) {
          return 1;
      }
      //如果函数的匿名函数,那么要在函数内部调用自身,可以使用arguments.callee
      return arguments.callee(n - 1) + n;
  })(100));

  //console.log(demo(3000));  //1+2+3

</script>

Function的小应用

数组去重

  • 示例代码 :
<script>
     // 使用反括号`` 其实这里是走个铺垫 为之后的node.js
    var func = new Function(`
     var arr = [];
        for (var i = 0; i < arguments.length; i++) {
            //去arr数组中查找指定的元素是否存在,如果不存在那么就添加
            if (arr.indexOf(arguments[i]) == -1)
            {
                arr.push(arguments[i])
            }
        }
        return arr;

    `)
    console.log(func(1, 2, 3, 4, 5, , 4, 7, 8, 2, 8, 9));
</script>

求最大值

  • 示例代码 :
<script>
    function getMax(){
        var maxNum = arguments[0];
        //遍历arguments
        for (var i = 0; i < arguments.length; i++) {
            if (maxNum < arguments[i])
            {
                maxNum = arguments[i];
            }
        }

        return maxNum;
    }

    console.log(getMax(1, 20, 30, 21,220,44,55,123));
</script>

eval 函数

作用:把字符串转换为js的代码

  • new Function("字符串"); // 把字符串转换为js的代码

区别:

  • Function:当函数调用的时候才会执行
  • eval:立刻执行
使用建议:不推荐使用(js是词法作用域,eval和with可以动态的调整破坏js的词法作用域),性能不好。
  • 场景:页面中接收用户的js代码 + json处理

Json和XML

  • ** json是一种国际标准协议,只要我们将数据转换成这个格式,就能实现传输**
  • XML比json更国际化标准,在所有语言中通用
  • 从整个互联网开发来看 XML占据80%,而json只有20%. 如果是前端开发的话,json占据55%,而XML占据45%
  • HTML就是一种XML,XML不是一种语言,是一种规定,协议.

Json协议和XML协议区别

  • 相同点
    1.都是一种通信协议
    2.都可以用来描述数据

  • 不同点
    1.json:一种轻量级的数据结构,用来表示、存储、传输数据.
    2.XML专用带宽大,json占用带宽小
    3.json没有XML这么通用

    4.json可以和js对象互相转换,和js是天生的一对,因此广泛用于前端开发
    5.XML已经被业界广泛的使用,而json才刚刚开始,但是在Ajax这个特定的领域.未来的发展一定是XML让位给json

  • 示例代码 :

<script>
    //把JSON数据转换为对象
    var obj = JSON.parse("{\"name\":\"默默的备胎\"}");

    console.log(obj);
    //把对象转换为json数据
    var str = JSON.stringify(obj);
    console.log(str);
</script>
<script>
    var jsonStr = "{\"name\":\"默默的备胎\"}";
    //json--->对象
    eval("var o =" +jsonStr);
    console.log(o);
    var obj = eval("(" + jsonStr +")");
    console.log(obj);
</script>

Function.prototype的原型链

  • Function是Object构造函数的实例对象
  • Object可以看作是Function的实例对象
  • 示例代码 :
<script>
    function Person(){}
    function Boy(){}
    //设置继承
    var p1 = new Person();
    Boy.prototype = p1;

    var boy = new Boy();
    //console.log(Function.prototype);  //function () {}
    console.log(Boy.__proto__ == Function.prototype);
    console.log(Boy.__proto__.constructor);   //function Function() { [native code] }
    console.log(Boy.__proto__.__proto__ == Object.prototype);     //
    console.log(Function.constructor == Function);
    console.log(Function.__proto__ == Function.prototype);
</script>
<script>
    console.log(Object.constructor);
    console.log(Object.__proto__);
    console.log(Object.__proto__ == Function.__proto__);
</script>
  • 解释
    1.Boy构造函数本身是一个对象,因此有构造函数,它的构造函数是Function,它的原型对象是Boy.proto == Function.prototype 空函数
    2.Function的原型对象是一个空的函数
    3.这个空的函数也是一个对象,因此也有构造函数,它的构造函数是Function
    4.推论:Function的原型对象是空函数,因此空函数的原型对象应该是自己(错误)是空的对象
    5.空函数的原型对象 == Object.prototype
    6.Function也是一个对象,因此也有构造函数,它的构造函数是谁?是自己Function
    7.Function作为一个对象来说,也有自己的原型对象Function.proto
    8.Function对象的原型对象和其构造函数的原型对象是空函数
    9.Object.prototype的构造函数是Object
    10.Object本身也是一个对象,因此也有自己的构造函数--->Function

  • 图解 --> 可以慢慢理解 这种东西急不得

**Function的原型链**

with的使用

  • 作用:把对象的作用域引申到{}中,达到缩减代码的目的
  • 应用场合:在写代码的时候,要写很长的前缀.对象.属性.属性.属性
  • 具体的使用注意:
    1.在{}中不能使用无前缀的方式来增加属性
    2.this应该是谁? window
    3.严格模式下,with被禁止使用了
  • 使用建议:不建议使用 ,因为内部的this指向会有问题

私有变量和私有函数

  • 在构造函数内部声明的变量称之为私有变量
  • 示例代码 :
<script>
    function Person(){
        this.name = "momo";
        this.showName = function(){};

        var a = "测试的值";
        function getA(){
            return a;
        };
        //像test这样的实例方法,它可以访问构造函数内部的变量和函数,这种方法被称为特权方法
        this.test = function(){
            console.log(getA());
        };

    }

    var p1 = new Person();
    p1.test();
</script>

**更多精彩内容 请点击跳转 **


虽然讲了这么多了,但是还没有完,宝宝心里也苦啊! 外国人的东西么的办法,要想超越人家,再不学习,都要被甩出外太空了 !!!
未完待续 ...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 这一节,主要讲解面向对象的继承,回顾上一节讲解到判断对象原型和实例对象的两种方法.废话不多说,直接上代码 ! 继承...
    西巴撸阅读 463评论 0 0
  • 第十章 变量、作用域及内存 JavaScript的变量与其他语言的变量有很大区别。JavaScript变量是...
    上书房_张强阅读 414评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 酒水对婚宴来说是很重要的一个环节,一般而言,多数人一生只会举办一次婚宴,喜酒就属于“一次性消费”了。即使是“一次性...
    wangder阅读 319评论 0 1
  • 佳人江畔,裕美婀娜,鸟语空山。梁祝蝶舞翩翩,情多处,山水相伴。望水粼波澹澹,如情痴山涧。邀曲曲翼比双飞,已难舍...
    栋赵阅读 274评论 1 3