javascript创建动态函数: JavaScript支持创建动态函数,动态函数必须用Function对象来定义(Function是javascript中的一个对象,是固定不变的,规定Function对象的"F"必须大写,当是function的时候,我们知道是定义函数的时候所使用的一个关键字:function funName(x,y),当是Function的时候(F大写的时候),我们知道是javascript中的对象) 创建动态函数的基本格式:var 变量名 = new Function("参数1","参数2","参数n","执行语句"); 看下面的一段代码: 复制代码 代码如下: <script type="text/javascript"> var square = new Function ("x","y","var sum ; sum = x+y;return sum;"); alert("square(2,3)的结果是:"+square(2,3)); //square(2,3)的结果是:5 </script>
square是动态创建的函数,在Function对象后面的括号里的每一部分内容都必须是字符串形式的,也就是说都必须用引号(""或者是"")括起来 这段代码: var square = new Function ("x","y","var sum ; sum = x+y;return sum;"); 和下面这段代码: 复制代码 代码如下: function square (x,y){ var sum; sum = x+y; return sum; }
作为构造函数调用 所谓构造函数,就是通过这个函数生成一个新对象(object)。 复制代码 代码如下: <script type="text/javascript"> function test(){ this.x = 10; } var obj = new test(); alert(obj.x); //弹出 10; </script>
可以使用 new 运算符结合像 Object()、Date() 和 Function() 这样的预定义的构造函数来创建对象并对其初始化。面向对象的编程其强有力的特征是定义自定义构造函数以创建脚本中使用的自定义对象的能力。创建了自定义的构造函数,这样就可以创建具有已定义属性的对象。下面是自定义函数的示例(注意 this 关键字的使用)。 复制代码 代码如下: function Circle (xPoint, yPoint, radius) { this.x = xPoint; // 圆心的 x 坐标。 this.y = yPoint; // 圆心的 y 坐标。 this.r = radius; // 圆的半径。 }
调用 Circle 构造函数时,给出圆心点的值和圆的半径(所有这些元素是完全定义一个独特的圆对象所必需的)。结束时 Circle 对象包含三个属性。下面是如何例示 Circle 对象。 var aCircle = new Circle(5, 11, 99); 使用构造器函数的好处在于,它可以再创建对象时接收一些参数。 复制代码 代码如下: <script type="text/javascript"> function Test(name){ this.occupation = "coder"; this.name = name; this.whoAreYou = function(){ return "I"m " + this.name + "and I"m a " + this.occupation; } } var obj = new Test("trigkit4");//利用同一个构造器创建不同的对象 var obj2 = new Test("student"); obj.whoAreYou();//"I"m trigkit4 and I"m a corder" obj2.whoAreYou();//"I"m student and I"m a corder" </script>
依照惯例,我们应该将构造器函数的首字母大写,以便显著地区别于一般的函数。 以下两种形式的定义函数方式是等价的。 复制代码 代码如下: <script type="text/javascript"> var test = function(){ alert("Hello World"); } alert(typeof(test));//output function </script>
这里明确定义了一个变量test,他的初始值被赋予了一个function实体 复制代码 代码如下: <script type="text/javascript"> function test(){ alert("Hello World"); } alert(typeof(test));//output function </script>
看看下面这种定义式函数形式: 复制代码 代码如下: <script type="text/javascript"> function test(){ alert("Hello World"); }; test();//居然输出Hello,很奇怪不是吗? function test(){ alert("Hello"); }; test();//正常滴输出了Hello </script>
很显然,第一个函数并没有起到作用,很奇怪不是吗?我们知道,javascript解析引擎并不是一行一行地执行代码,而是一段一段地执行代码。在同一段程序的分析执行中,定义式的函数语句会被优先执行,所以第一个定义的代码逻辑已经被第二个覆盖了,所以两次调用相同函数,只会执行第二个。 作为值的函数 函数在js中不仅是一种语法,也是一个值。也就是说可以将函数赋值给变量,存储在对象的属性或数组的元素中,作为参数传入另一个函数中。 函数的名字实际是看不见的,它仅仅是变量的名字,这个变量指代函数对象 复制代码 代码如下: <script type="text/javascript"> function square(x,y){ return x*y; } var s = square; //s和square指代同一个函数 square(2,3);//6 s(2,4);//8 </script>
除了可以将函数赋值给变量,同样可以将函数赋值给对象的属性,当函数作为对象的属性调用时,函数就称为方法 复制代码 代码如下: <script type="text/javascript"> var obj = {square:function(x,y){ //对象直接量 return x*y; }}; var ect = obj.square(2,3); </script>