javascript权威指南笔记(第8章 函数)

8.1 函数定义:

  变量声明提前,但是变量赋值并不会提前

  函数声明语句不能出现在循环,条件判断或者try/catch/finally以及with语句中:



8.2 函数调用(函数调用,方法调用,构造函数调用,间接调用(call,apply))

  1、var isStrict = (function() { return !this; }());

  2、this的指向问题(嵌套函数this的指向问题)

    可以解决的方法有:var self = this 或者使用 apply

//嵌套函数
var o = {
    m: function () {
        var self = this;                   //将this的值保存在一个变量中
        console.log(this === o);
        f();
        function f() {
            console.log(this === o);                  //false   this的值是全局对象或undefined
            console.log(self === o);            //true
        }
    }
};
o.m();


8.3 函数的实参与形参

  1、可选参数

function getPropertyNames(o, /* optional */ a) {
    if (a === undefined) a = [];
    for (var property in o) a.push(property);
    return a;
}

var a = getPropertyNames(o);
getPropertyNames(p, a);

  可以使用a = a || [] 来代替上面的if语句,但是a必须是预先声明的,因为a是作为参数传入的,即相当于var a;所以这里也可以这么使用  

  2、可变长的实参列表,实参对象arguments,它是一个类数组对象

    实参对象的属性:length/callee/caller

function max(/* ... */) {
    //最小值
    var max = Number.NEGATIVE_INFINITY;
    for (var i = 0; i < arguments.length; i++)
        if (arguments[i] > max) max = arguments[i];
    return max;
}
var largest = max(1, 10, 100, 2, 3, 1000, 4, 5, 10000, 6);  // => 10000

    在非严格模式下,对实参对象arguments对象进行操作会影响到传入的参数,如删除其中一个元素或是改变length属性等都会影响到参数

    严格模式下,对caller或是callee进行读写操作都会产生一个类型错误:

    callee:指代当前正在执行的函数

    calller:指代调用当前正在执行的函数的函数

   3、将对象属性用作实参

      参数的顺序问题:

//这里需要记住参数顺序
function arraycopy(/* array */ from, /* index */ from_start, /* array */ to, /* index */ to_start, /* integer */ length) {
    //code goes here
}

//这个版本效率低,但是不用记住参数顺序
function easycopy(args) {
    arraycopy(args.from,
              args.from_start || 0,  // Note default value provided args.to,
              args.to_start || 0,
              args.length);
}
// Here is how you might invoke easycopy():
var a = [1, 2, 3, 4], b = [];
easycopy({from: a, to: b, length: 4});

4、实参类型

  传入参数时,先检测传入的参数

function sum(a) {
    if (isArrayLike(a)) {            //这个函数在第七章
        var total = 0;
        for (var i = 0; i < a.length; i++) {
            var element = a[i];
            if (element == null) continue;
            if (isFinite(element)) total += element;
            else throw new Error("sum(): elements must be finite numbers");
        }
        return total;
    }
    else throw new Error("sum(): argument must be array-like");
}

//尽可能的在抛出异常之前将非数字转换为数字
function flexisum(a) {
    var total = 0;
    for (var i = 0; i < arguments.length; i++) {
        var element = arguments[i], n;
        if (element == null) continue;
        if (isArray(element))
            n = flexisum.apply(this, element);
        else if (typeof element === "function") n = Number(element());
        else n = Number(element);
        if (isNaN(n))  throw Error("flexisum(): can‘t convert " + element + " to number");
        total += n;
    }
    return total;
}


8.4 作为值的函数

时间: 2024-08-02 05:49:15

javascript权威指南笔记(第8章 函数)的相关文章

JavaScript权威指南笔记——第1部分

# <JavaScript权威指南>笔记--第1部分 说明: 印刷版:2012年4月第1版 2016年9月第17次印刷. 本书的风格和<Effective Java>很类似,推荐一下. 该笔记逆序记录的. ----------------------- ------<end>------ | node的helloworld程序: ```js //! program.js // 通过在命令行输入`node program.js`来运行,然后在浏览器中打开网址`127.0.

javascript权威指南笔记(第6章 对象)

1.对象概述 1.对象常见的用法: create .set .Query .delete .test.enumerate 2.对象的属性特性: 可写.可枚举.可配置 3.每个对象的对象特性: 原型.对象的类.对象的可扩展性 4.对象和属性分类: 内置对象.宿主对象.自定义对象.自由属性.继承属性 2.创建对象 1.对象直接量 2.通过new创建对象 3.原型 4.Object.create() 第一个参数:这个对象的原型 第二个参数:可选.对对象的属性进行进一步描述 var o1 = Objec

javascript权威指南笔记(第9章 类和模块)

1.工厂函数 function range(from, to) { var r = inherit(range.methods); r.from = from; r.to = to; return r; }; range.methods = { includes: function (x) { return this.from <= x && x <= this.to; }, foreach: function (f) { for (var x = Math.ceil(this

javascript权威指南笔记(第7章 数组)

1.注意: a[-1.23] = true; // This creates a property named "-1.23" a["1000"] = 0; // This the 1001st element of the array a[1.000] // Array index 1. Same as a[1] 2.delete操作符产生稀疏数组 3.设置数组的长度会自动切断或添加undefined 4.javascript不支持真正的多维数组但是可以用数组的数

学习《Javascript权威指南》的第二章笔记

1.Javascript区分大小写,但是HTML不区分大小写 2.JS会忽略标识之间的空格,多数情况下也会忽视换行符,所以要采用 整齐.一致的编码风格 3.//用作结尾的注释,/* 和 */可以当跨行的注释,但不能有嵌套的注 释 4.标识符必须以字母.下划线或美元符号开始(数字是不允许作为首字 符出现的),后续字符可以包括数字 为方便起见我们一般用ASCII字母和数字来表示 5.对于分号“:”如果一条语句是独占一行的就可以不用在后面加分号 注意:并不是在每一处换行时都要加上分号,只有在缺少了分号

javascript权威指南笔记(第10章 正则表达式的模式匹配)

1.非贪婪的重复:如"??" .   "+?"   . "*?"  ."{1,5}?" 例如: 非贪婪匹配 /a+?/去匹配aaa,尽可能的少匹配,只能匹配到第一个a, /a+/去匹配aaa,匹配到了aaa /a+b/去匹配aabb,匹配到aabb 而使用非贪婪匹配/a+?b/,它会匹配尽可能少的a和一个b,但是匹配到了aabb,因为会寻找正则表达式第一个匹配的位置 2.圆括号的作用 1.将单独的项组合成子表达式 2.完整的模

1.语言概述-JavaScript权威指南笔记

上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格.另外要说的是,可能很多地方是摘抄转述和不精确的个人阶段,开始阶段先这样好了,希望看到自己成长. 1.前端开发工程师必备三种技能:描述网页内容之HTML,描述网页样式之CSS,描述网页行为之JavaScript. HTML:Hyper Text Markup Language.超文本标记语言,据说并不

3.类型、值和变量-JavaScript权威指南笔记

开始变得有意思起来了,然而第三章还是以基础知识了解的角度阐释相关的概念,并没有深入到结合代码以及要实现的功能讲用法和原理的程度. 1.概论. value:程序的运行是对值的操作. type:能够表示并操作的值,它们的类型称作数据类型.编程语言的基本特性是能支持多种数据类型. variable:变量是某个值的符号名称,通过名称获得对该值的引用. JavaScript的数据类型分为:原始类型-primitive type:对象类型-object type. JavaScript解释器可以自动对内存进

2.词法结构-JavaScript权威指南笔记

今天是第二章.所谓词法结构(lexical structure),就是写代码中最基本的东西,变量命名,注释,语句分隔等,这是抄书抄的... 1.字符集,必须是Unicode,反正Unicode是ASCII的超集,各种语言妥妥支持,克林贡语=.=?当我没说 2.JavaScript是区分大小写的. 这一点给我留下了深刻印象.去年五月份,第一次写JavaScript,document.getElementById()写成了document.getElementByID(),妈蛋整整一个上午硬是get