javascript学习笔记(二)

本文详细解析了JavaScript函数的特性和用法,包括函数作为数据类型的应用、参数操作、构造函数使用以及如何在函数中添加静态变量,提供了一系列有趣的实验案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我从我的其它博客中转载过来的学习记录。

看的书是JavaScript The Definitive Guide 作者:David Flannagan


五、函数(function)

函数作为javascript的一种特殊数据类型,使它在使用上十分灵活。它可以像在C语言里的函数指针那样对函数灵活的操作。然而, javascript里的函数却远比C语言里的函数方便和好用。首先,它的函数名是函数体本身的引用,可以通过函数名调用函数体。通常的用法咱就不说了。 下面看看一些有意思的:
function square(x) {return x*x;}
a = square;
b = a(5); //b is 25.
////////
o = new Object();
o.sq = square;
c = o.sq(6); //c is 36.
///////
a = new Array(3);
a[0] = square;
a[1] = 7;
a[2] = a[0](a[1]);   //a[2] is 49.
///////
function doOperation(op_name, operand1, operand2)
{return op_name(operand1, operand2);}
//=============================

说完了函数名,再说说函数的参数。由于javascript语言本身的不严格,你可以给一个不需要参数的函数加一个参数,也可以给一个需要两个参数的函数 只一个参数。总之,javascript本身不会说你这样做非法。事实上,javascript的参数在函数体中是以数组的形式存在的。这里要插入一些东 西,以便说明javascript函数的参数:在javascript的类里引用自己时使用关键字this;而在javascript函数里呢,我们就使 用函数名来指代函数本身。在pascal(delphi)中也可以在函数中使用自己的函数名,但是在那里指代的是函数的返回值,而不是函数本身,这一点要 知道。好了,知道了函数名的作用,我们就可以在函数中正确的利用它了。说实话,在这个时候会让我们感觉不是在函数里,而更像在一个类里。 javascript里的function和object就是这样“难以纠缠”(事实上function就是Object实现的)。
function sqr() {return sqr.arguments[0] * sqr.arguments[1];}
//=============================
function f(x,y,z)
{
      if (f.arguments.length != 3) {
            alert("function f called illegally!");
            return;
      }
      //do something.
}
//=============================


刚才我在括号里说javascript里的function就是类(但是typeof会返回function;同样对于字符串,typeof返回string而不是object)。现在我们来这里看个究竟。
Function()构造函数:函数也有构造函数,这听起来的确是有点别扭,如果你不信,可以自己试试:
var f = new Function("x", "y", "return x*y;");
alert(f(3,9));

在函数的构造函数里,它所接受的都是字符串参数,并且将最后一个参数当作函数体,前面的参数当作函数的参数。你也应该感觉到了,这种用法很不雅观,因此在能用正常的函数定义方法时就不应该使用这样的定义方式。
在实际中,我们可能有一些理由使用Function()。比如在类里的函数定义时,你可能这样写:
function tmp(){return Math.PI * this.radius * this.raduis;}
Circle.area = tmp;

你现在就可以这样写了:
Circle.area = new Function("return Math.PI * this.radius * this.radius;");

还有一种情况就是当你定义的函数只在一处使用,而且没有必要使用名字的时候。还记得C语言里的qsort吗?它就需要一个函数作参数。在我们自己写 javascript函数时,也会遇到使用函数来作参数的时候。这时我们就可以简单地直接new一个函数传过去。这和java里的匿名类有点儿相似。在. NET 2.0版里有个新特性美其名曰“匿名代理(anonymous delegate)”,它就和这里实现的功能是很相似的。事实上,在javascript里它就叫做匿名函数(anonymous function)。下面是一个有趣的实验:
var f = new Function("x", "y","return x*y;");
function g(a,b)
{return a*b;}
alert(f);
alert(g);

在你的浏览器里运行看看就知道了。对于g,它会把你对它的定义原封不动地搬出来。而f则是浏览器的解释器组装出来的anonymous function。
============
给函数“类添加值”:
如同我们在创建类时那样。在函数里我们可以使用如下代码:
function f() {alert("hello");}
f.i = 3;
var o = f.i + 2;

说实话,只有你真正理解你在做什么的时候你这样做才是可行的。因为当你把它当作一个函数看待时,f.i的行为以及属性不是那么确定的。
呵呵,不要被我刚才说的给吓倒了,使用上面的方法是可以产生很特别的用法的。那就是在一个函数需要使用静态变量的时候。它就会产生和C/C++等语言一样的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值