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 种调用模式:

  1. 方法调用模式

    当一个函数被保存为对象的一个属性时,则称其为对象的一个方法。当被调用是this被绑定到该对象。

    var obj =  {
    	sum: 0,
    	add: function(num){
    		this.sum += num || 1;
    	}
    }
    obj.add();
    obj.sum; // 1
    obj.add(2);
    obj.sum; // 3
    

    通过this可取的该对象的上下文的方法称为公共方法。

  2. 函数调用模式

    当一个函数不是一个对象的属性时,那么该函数被当做一个函数来调用:

    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();
    
  3. 构造器调用模式

    构造函数约定是以大写格式命名函数名的函数,通过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
    
  4. 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;
    

1.3.4 每个函数除了声明定义的形式参数,还接收附加的两个参数:

  • this - 值取决于调用的模式
  • arguments - 函数的实际参数个数,类似数组,但不是数组

1.3.5 调用函数时函数参数个数不匹配是不会导致运行错误,多的参数会被忽略,少的参数会默认是undefined。

function add3(a, b, c) {
	console.log("" + a + b + c);
}
add3(1, 2, 3, 4); // 123
add3(1, 2); // 12undefined

欢迎访问我的博客 Ama_zhe
--------内容系个人整理,如有错误,欢迎指出。谢谢!--------

你可能感兴趣的:(JavaScript)