JavaScript

JavaScript - 函数相关知识点

2017-02-28  本文已影响29人  西巴撸

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

arguments:接收实参

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

length属性

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

<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>
<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>
<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
<script>
    function demo1(){
        console.log(demo1.caller);   //demo2这个函数
    }

    function demo2(){
        demo1();
    }

    demo2();
    demo1();
</script>
<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的代码

区别:

使用建议:不推荐使用(js是词法作用域,eval和with可以动态的调整破坏js的词法作用域),性能不好。

Json和XML

Json协议和XML协议区别

<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的原型链

<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>
**Function的原型链**

with的使用

私有变量和私有函数

<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>

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


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

上一篇下一篇

猜你喜欢

热点阅读