论坛首页 Web前端技术论坛

《javascript权威指南第五版》函数/方法

浏览 1897 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-13  
javascript权威指南第五版 函数
一个函数是可以被不断调用,运行的JavaScript代码块。
一个被对象调用的函数成为方法

定义和调用函数
一个函数有:函数名,一个或多个参数名和用大括号组织起来的语句

定义函数的例子:
//返回undefined
function print(msg) {
    document.write(msg, "<br>");
}

// 计算并返回
function distance(x1, y1, x2, y2) {
    var dx = x2 - x1;
    var dy = y2 - y1;
    return Math.sqrt(dx*dx + dy*dy);
}

// 递归
function factorial(x) {
    if (x <= 1)
        return 1;
    return x * factorial(x-1);
}

当函数定义后,可以用()操作符来调用
print("The probability of that is: " + factorial(5)/factorial(13));

8.1.1 内函数
Javascript可以内置函数
function hypotenuse(a, b) {
    function square(x) { return x*x; }
    return Math.sqrt(square(a) + square(b));
}


因为函数和类一样都是一等公民,Scala也允许有内函数

8.1.2 Function Literals
Javascript允许函数定义为:function literals.
function f(x) { return x*x; }              // function statement
var f = function(x) { return x*x; };       // function literal


同样Scala也有这个特性

8.2 函数参数
Javscript可以把函数当成参数进行传递。因为函数是松类型(loosely typed),所以可以传递任何类型的参数值给任何函数。

可选参数
如果传入的参数数量少于需要的数量,那么剩下的参数值都为undefined
如:定义函数拷贝,如果参数a没有传入那么创建一个空数组
function copyPropertyNamesToArray(o, /* optional */ a) {
    if (!a) a = [];  // If undefined or null, use a blank array
    for(var property in o) a.push(property);
    return a;
}


调用该函数:
var a = copyPropertyNamesToArray(o); // 将o的值拷贝给新的数组
copyPropertyNamesToArray(p,a);       // 将p的值拷贝给数组a


8.2.2 可变参数列表:参数对象
Javascript可以侦测函数传入参数的数量
function f(x, y, z)
{
    // 访问arguments对象判断读入的参数长度
    if (arguments.length != 3) {
        throw new Error("function f called with " + arguments.length +
                        "arguments, but it expects 3 arguments.");
    }
    // Now do the actual function...
}


Javascript把传入的参数都放在可变的对象arguments中,因此可以传入不定长的参数列表
function max(/* ... */)
{
    var m = Number.NEGATIVE_INFINITY;
    // 循环便利参数 
 looking for, and
    // 记录最大的值
    for(var i = 0; i < arguments.length; i++)
        if (arguments[i] > m) m = arguments[i];
    // 返回最大值
    return m;
}

var largest = max(1, 10, 100, 2, 3, 1000, 4, 5, 10000, 6);



Javascript不是强类型定义,如果需要确定的类型参数,可以使用类似的判断:

if ((a instanceof Array) ||                         // if array
        (a && typeof a == "object" && "length" in a)) { // or array like
}


8.3 函数作为数值
Javascript中可以将函数当作数在传递,存储和使用
比如定义一个函数:
function square(x) { return x*x; }

然后可以:
var a = square(4);  // a存了16
var b = square;     // b存储了square这个方法!
var c = b(5);       // c存了25


8.4 函数作为方法
当函数在对象中被调用的时候成为方法
var calculator = {  // 定义一个对象
    operand1: 1,
    operand2: 1,
    compute: function() {
        this.result = this.operand1 + this.operand2;
    }
};
calculator.compute();       // 调用方法compute()
print(calculator.result);   // 打印结果



8.6.4 ECMAScript有两个特殊的方法call()和apply()
假设有对象o和函数f
f.call(o, 1, 2);

就等同于
o.m = f;
o.m(1,2);
delete o.m;


appy()和call很类似,只是要用数组传值
f.apply(o, [1,2]);


论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics