《javascript语言精粹》读书笔记二

本节是对语言精粹第四章的一些总结和精华梳理,因为这一章主要是说明函数这个js中的一等公民的,所以专门抽出一节来希望把这个部分说透。

第四章

函数对象,函数对象也是一个对象之中,函数对象在创建中会产生一个prototype属性。

函数字面量,通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这被称为闭包。这是js强大表现力的来源。

函数调用方式,函数一共有四种调用方式,这四种调用方式在初始化this这个关键参数上存在差异:
1. 方法调用模式
2. 函数调用模式
3. 构造器调用模式
4. apply调用模式

对于1、方法调用模式,简单说this对象指向调用的者,ex:

js code:
    var x = {
        value: 0,
        call: function() {
            console.log(this.value);
        }
    }

    x.call();// 0,此时this指向x

对于2、函数调用模式对于函数调用模式上,this将会被绑定到全局对象上,书中说这是一处设计失误,不过我觉得可以这样理解,当函数调用模式中,可以理解为调用函数为window.x,所以在此模式下指向window,ex:

js code:
    function x() {
        console.log(this);
    }

    x();//window

对于3、构造器模式,在此模式中,this将指向被new函数实例化后的函数,ex:

js code:
    var X = function() {
        this.zak = 'wu';
    }

    X.prototype.getName = function() {
        console.log(this.zak);
    }
    // 实例化
    var x = new X();
    x.getName();// 'wu';

对于4、apply调用模式,在此模式中,this将是调用时传入的绑定对象,也就是apply(call)传入的第一参数,ex:

js code:
    var X = function() {
        this.zak = 'wu-X';
    }
    var y = {
        zak:  'me-Y'
    }

    X.prototype.getName = function() {
        console.log(this.zak);
    }
    // 实例化
    var x = new X();
    x.getName.apply(y);// 'me-Y';

函数参数,函数的参数当实参数量不等于形参时,将不会产生运行时错误。当实参数量多时,多的参数将会被赋值为undefined,当实参数量少时,未传入参数将会被赋值为undefined。当函数创建时,将会传入arguments作为默认属性,arguments是一个类数组对象,他有length,但是没有数组相应的一系列方法。可以通过[].slice.call(arguments)将其转换为真正的数组。

函数返回,当函数执行到return语句时将会返回,当没有return语句时将返回undefined,这里有一个特例,如果在函数调用时在前面加上了new前缀,且其返回不是一个对象时,将会返回this。

当然,本章的内容很多,比如递归,记忆,模块等等各种编码方案,或者说是最佳实践,写的都很棒,值得细读。

Table of Contents