JavaScript 整理笔记(四)

1.3 函数

1.3.1 函数对象

Javascript 中的函数也是对象。函数对象连接到Function.prototype,该原型对象本身
连接到 Object.prototype。
每个函数对象在创建时会有一个prototype属性。它的值是一个拥有 constructor 属性
且值为该函数的对象。
例:
    function a(){};
    a.prototype.constructor;  // function a(){}

函数的不同之处在于它可以被调用。
例:
    a(); // 调用函数a

1.3.2 函数字面量

函数对象通过函数字面量来创建:
    var reduce = function(a, b){
        return a - b;
    }

1.3.3 调用

4种调用模式:
    方法调用模式
        当一个函数被保存为对象的一个属性时,则称其为对象的一个方法。当被调用是this被绑定到该对象。
            var obj =  {
                sum: 0,
                add: function(num){
                    this.sum += num || 1;
                }
            }
            obj.add();
            obj.sum; // 1
            obj.add(2);
            obj.sum; // 3
        通过this可取的该对象的上下文的方法称为公共方法。

    函数调用模式
        当一个函数不是一个对象的属性时,那么该函数被当做一个函数来调用:
            function add(a, b){
                return a + b;
            }
            var sum = add(1, 2);
            sum; // 3
        此模式调用函数时,this会被绑定到全局对象。这是语言设计上的错误。
        我们一般通过定义一个变量来给它赋值this。一般是 that 或 _this。
            obj.add2 = function(){
                var that = this;
                var a = function(){
                    that.sum = add(that.sum, that.sum);
                }
                a(); // 6
                var b = function(){
                    this.sum = add(this.sum, this.sum);
                }
                b(); // undefined 该函数中sum为undefined
            }
            obj.add2();

    构造器调用模式
        构造函数约定是以大写格式命名函数名的函数,通过new来调用,但是不加上new,也不会警告,
        这个很蛋疼。
        在上述面前加new来调用时,会默认创建一个连接到该函数的prototype成员的新对象,同时this
        也会绑定到这个新对象上。
            var Fn = function(value){
                this.value = value;
            };
            Fn.prototype.getValue = function(){
                return this.value;
            }
            var fn = new Fn(1001);
            fn.getValue(); // 1001

    apply调用模式
        apply方法会构建一个参数数组传递给调用函数。也允许选择this的值。
        var arr = [1, 2];
        var sum = add.apply(this, arr);
        sum; // 3
        var sum2 = add.apply(null, arr);
        sum2; // 3

        var o = {
            value: 2002
        };
        var value = Fn.prototype.getValue.apply(o);
        value; // 2002
        // apply 会把 this 指向 o , 所以会返回 this.value 即 o.value;

每个函数除了声明定义的形式参数,还接收附加的两个参数:
    this       - 值取决于调用的模式
    arguments  - 函数的实际参数个数,类似数组,但不是数组

调用函数时函数参数个数不匹配是不会导致运行错误,多的参数会被忽略,少的参数会默认是undefined。
例:
    function add3(a, b, c) {
        console.log("" + a + b + c);
    }
    add3(1, 2, 3, 4); // 123
    add3(1, 2); // 12undefined

——–内容系个人整理,如有错误,欢迎指出。谢谢!——–

猜你喜欢

转载自blog.csdn.net/Ama_zhe/article/details/81569541