《javascript语言精粹》读书笔记——函数

这几天发现了一本好书,又薄又精辟,《JavaScript语言精粹》
看了对象、函数这两节,发现书如其名,确实是精粹。

函数的调用

函数调用的方式有四种:
- 方法调用模式
- 函数调用模式
- 构造器调用模式
- apply调用模式

方法调用模式

这个方法是经常会见到的一种模式,方法作为对象的一种属性,通过obj.functionName()这种调用方式调用,如:

var myObject = {
    value: 0;
    increment: function(inc) {
        this.value += typeof inc === 'number' ? inc : 1; //默认增加为1
    }
}
myObject.increment(); //方法调用模式
console.log(myObject.value); //1

myObject.increment(2);
console.log(myObject.value); //3

方法调用的好处就是,this绑定的是调用该方法的对象,因此它可以访问myObj.value

函数调用模式

当一个函数并非一个对象的属性时,那么它被当作一个函数来调用:

var sum=add(3,4)

当采用这种方式调用时,this被绑定到全局对象。

例如:

var a = 'gloabal:';

function test() {
    var a = 'add:';
    return (function() {
        return this.a + 1;
    })()
}
var sum = test();
console.log(sum);//global:1

按道理来讲,test里面的匿名函数应该访问test的a,但是this却指向了global;

如果声明“use strict” ,会报异常:Cannot read property ‘a’ of undefined
作者说这是JavaScript语言设计上的错误。倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量。

解决方法:

function add(a, b) {
    return a + b;
}
var myObject = {
    value: 1,
    getValue: function() {
        return this.value;
    }
}
myObject.double = function() {
    var that = this;
    var helper = function() {
        that.value = add(that.value, that.value);
    }
    helper(); //以函数方式调用helpher
}
myObject.double();
console.log(myObject.getValue()); //2

构造器调用模式

javascript是一门基于原型继承的语言。这意味着对象可以直接从其他对象继承属性。
书中的例子:

var Quo = function(string) {
    this.status = string;
}
Quo.prototype.get_status = function(first_argument) {
    return this.status;
};

var myQuo = new Quo('Confused');
console.log(myQuo.get_status());

说明:
1、这里声明了一个Quo类
2、Quo具有属性status,和原型方法get_status
3、因为get_status是Quo的原型属性,因此this指向调用Quo的对象

这种结合new前缀调用的函数,就被称作是构造器函数了。
如果调用函数没有在前面加上new,会发生非常糟糕的事情,既没有编译时的警告,也没有运行时警告,所以大写约定非常重要。

apply调用模式

javascrip是一门函数式的面向对象编程语言,所以函数可以拥有方法。
apply方法让我们可以构建一个参数并用其去调用函数,它也允许我们选择this的值,apply方法接收两个参数。第一个是将被绑定给this的值,第二个是一个参数数组

var array = [3, 4];
var sum = add.apply(null, array);
/*延续demo3,利用apply,不需要new关键字,把对象statusObject通过apply传递*/
var statusObject = {
    status: 'A-OK'
};
var Quo = function(string) {
    this.status = string;
}
Quo.prototype.get_status = function(first_argument) {
    return this.status;
};
var status = Quo.prototype.get_status.apply(statusObject);
console.log(status);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值