- 浏览: 1323989 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
-
函数定义
函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。
函数的构造语法有这三种:
function functionName(arg0, arg1, ... argN) { statements }//function语句 var function_name = new function(arg1, arg2, ..., argN, function_body);//Function()构造函数 var func = function(arg0, arg1, ... argN) { statements };//函数直接量
示例:
function f(x){return x*x};//function语句 var f = new Function("x","return x*x;");//Function()构造函数 var f = function(x){return x*x;};//函数直接量
如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是 undefined。
-
重载?
ECMAScript中的函数不能重载 。可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是后一个函数。考虑下面的例子:
function doAdd(iNum) { Alert(iNum + 100); } function doAdd(iNum) { Alert(iNum + 10); } doAdd(10);//20
不过可以使用arguments对象避开这种限制。
-
Function()构造函数
函数实际上是功能完整的对象 。Function类可以表示开发者定义的任何函数。用Function类直接创建函数的语法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
在上面的形式中,每个 arg 都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。
var sayHi = new Function("sName", "sMessage", "alert('Hello ' + sName + sMessage);"); sayHi("jzj,", "你好!");//Hello jzj,你好!
函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗?答案是可以的,请看:
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //输出 "20"
注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例 。
如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。
注意:传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被称为“匿名函数”。
Function()函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。
-
函数直接量
函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。语法:
var func = function(arg0, arg1, ... argN) { statements };//函数直接量
虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用,例如:
var f = function fact(x) { if (x <= 1) { return 1; } else { return x * fact(x - 1); } };
注:它并没有真正创建一个名为fact()函数,只是允许函数体用这个名字来引用自身。JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。
-
函数引用
函数名并没有什么实质意义,它不过是用来保存函数的变量名字,可以将这个函数赋给其他变量,它仍然会以相同方式起作用:
function square(x){return x*x;} var a = square; var b = a(5);//b 为25
这有点像C++中的函数指针了。
-
Function()构造函数和函数直接量差别
Function()构造函数和函数直接量之间的差别有一点就是:使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被顶级函数来编译,如:
var y = "global"; function constructFunction() { var y = "local"; //Function()构造函数 return new Function("return y;");//不使用局部作用域 } function constFunction() { var y = "local"; //函数直接量 var f = function () { return y;//使用局部作用域 }; return f; } //显示 global,因为Function()构造函数返回的函数并不使用局部作用域 alert(constructFunction()()); //显示 global,因为函数直接量返回的函数并使用局部作用域 alert(constFunction()());
-
函数的实际参数:Arguments对象
在函数代码中,使用特殊对象arguments ,标识符arguments引用Arguments对象。开发者无需明确指出参数名,就能访问它们。例如,在函数sayHi()中,第一个参数是message。用arguments[0]也可以访问这个值, 即第一个参数的值(第一个参数位于位置0,第二个参数位于位置1,依此类推)。因此,无需明确命名参数,就可以重写函数:
function sayHi() { if (arguments[0] == "bye") { return; } Alert("Hello" + arguments[0]); }
当函数具有命名的参数时,Arguments对象的数组元素是存放函数参数的局部问题的同义词。arguments[]数组和命名了参数不过是引用同一变量的两种不同方法。用参数名改变一个参数的值同时会改变通过arguments[]获得的值,当然通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值。如:
function f(x) { alert(x);//显示参数的初始值 arguments[0] = null;//改变数组元素也会改变x alert(x);//现在显示 null }
-
Arguments的属性length
arguments还具有length属性,参数的个数可用arguments.length 得到。
与其他程序设计语言不同,ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根 据Netscape的文档,最多能接受25个),而不会引发任何错误。任何遗漏的参数都会以undefined传递给函数,多余25的参数将忽略。 用arguments对象判断传递给函数的参数个数,即可模拟函数重载:
function doAdd(iNum) { Alert(iNum + 100); } function doAdd(iNum) { Alert(iNum + 10); } doAdd(10);//20
虽然不如重载那么好,不过已足可避开ECMAScript的这种限制。
-
Arguments的属性callee
Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这对象未命名的函数调用自身非常有用。下面是一个未命名的函数直接量,用于计算阶乘:
var f = function (x) { if (x <= 1) { return 1; } return x * arguments.callee(x - 1); }; alert(f(3));//6
当然也可以给它临时取个名:
var f = function tmpName(x) { if (x <= 1) { return 1; } return x * tmpName(x - 1); }; alert(f(3));//6
-
函数的属性length
因为函数是引用类型,所以它们也有属性和方法。 ECMAScript 定义的函数的属性 length (只读) 声明了函数声明的参数个数,与arguments.length不同,这个length属性在函数体的内部与外部都有效 。例如:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length);//输出: 1 alert(sayHi.length);//输出: 0
无论定义了几个参数, ECMAScript 函数可以接受任意多个参数(最多 25 个)。属性 length 只是为查看默认情况下函数声明的参数个数提供了一种简便的方式,它不你见arguments是动态变的。
-
函数的属性prototype
每个函数都有一个prototye属性,它引用的是预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用,它在定义新对象类时起着非常重要的的作用。
...
-
定义你自己的函数属性
当函数需要使用一个在调用过程中都保持不变的值时,使用Function对象的属性比定义全局变量(这样会使用名字空间变得散乱)更加方便。虽然我们可以将这信息存储在一个全局变量中,但是由于这一信息是由函数自己使用的,所以不必使用全局变量,最好的方法莫过于将信息存储在Function对象的属性中。
//创建并初始化静态变量 //因为函数声明在执行代码前处理,所以在函数声明前这样赋值是可以的 uniqueInteger.counter = 0; //下面的函数每次被调用时返回值都不同, //而且使用它自己的静态属性来跟踪它上次返回的值 function uniqueInteger() { //给静态变量加1,然后返回它的值 return uniqueInteger.counter++; } alert(uniqueInteger());//0 alert(uniqueInteger());//1
-
函数的方法apply()和call()
这2个关键字可以很简单地理解为 进行this引用对象(运行空间)强制转换 , 二者的语法如下:
- fun.call(object, arg1, arg2, ...)
- fun.apply(object, [arg1, arg2, ...])
二者目的是相同的(动态更改函数的运行空间, 或者称作更改this指向的对象),只是在提供给函数的参数上的调用方法不同。
使用这两个方法可以像调用其他对象的方法一样调用函数。call()和applay()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值(意思是会把第一个参数赋给函数体内的this,this以后就指向了第一个参数)。call()的剩余参数是传递给要调用的函数的值。例如,要把两个数字传递给函数f(),并将它作为对象o的方法调用,可以使用如下的代码:
function f (arg1, arg2){ this.attr1 = arg1; this.attr2 = arg2; } //-----第一种调用法 //如果在调用时前面未明确指定对象,则默认为window对象 f(1,2); //我们可以看到上面确实是由window对象来调用的 alert(window.attr1); alert(window.attr2); //-----第二种调用法 //此时构造体内的this就是当前new出来的对象 var fun = new f(3,4); alert(fun.attr1);//3 alert(fun.attr2);//4 //-----第三种调用法 var o = {}; //此时构造函数体内的this就指向了o f.call(o,5,6); alert(o.attr1);//5 alert(o.attr2);//6 //f.call(o,5,6);与下面的代码相似 o.m = f; o.m(5,6); delete o.m; alert(o.attr1);//5 alert(o.attr2);//6 //虽然前面指定了调用对象,但this还是指向o window.f.call(o,7,8); alert(o.attr1);//7 alert(o.attr2);//8
apply()方法和call()方法相似,只不过要传递给函数的参数是数组指定的:
f.apply(o,[5,6]);
例如,要找到一个数字数组中的最大数字,可以用apply()方法把数组元素传递给Math.max()函数:
var array_of_numbers = [5,7,3,6]; var biggest = Math.max.apply(null, array_of_numbers); alert(biggest);//7
-
函数的方法valueOf()和toString()
Function 对象也有与所有对象共享的标准 valueOf () 方法和 toString () 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用:
function doAdd(iNum) { alert(iNum + 10); } alert(doAdd.toString()); alert(doAdd.valueOf());
发表评论
-
HTML、JS、JSON特殊字符
2010-12-13 23:47 25802JS到HTML特殊字符转换 这几天做项目,发现从服务器端以J ... -
HTML — HTTP URL 中的特殊字符
2009-10-31 18:16 32301. + URL中的+号表示空格 ... -
HTML — CSS选择器
2009-10-25 21:11 2114一个样式规则由两部分组成:选择器和样式声明。选择器表明要为哪一 ... -
部分解决JsUnit无法在firefox3、safari 测试的问题
2009-10-25 07:03 1399在上一篇中出现了一个问题,就是用 jsunit2.2alpha ... -
JsUnit——eclipse插件(四)
2009-10-25 06:59 2396这节我们来看看如何通过JsUnit插件来运行前几节所测试过的测 ... -
10、JavaScript跨浏览器需注意的问题——ajax基础笔记
2009-10-21 22:19 1316向表中追加行 创建表格行时,我们要把创建的 tr 追加到 t ... -
JsUnit详解——Web服务方式(三)
2009-10-21 00:21 2387上两节提到过以Web方式来运行JsUnit,不过不是很详细,这 ... -
JsUnit详解——《ajax基础》笔记(二)
2009-10-20 22:38 2478使用标准/定制查询串 如此说来,测试运行工具是很强大的,但是 ... -
JsUnit详解——《ajax基础》笔记(一)
2009-10-20 19:57 2531JsUnit与JUnit对比 JsUnit也有setUp() ... -
使用Firefox的Web开发插件
2009-10-18 17:53 1431Firefox的Web开发插件为Firefox浏览器增加了大量 ... -
9、访问WEB服务(REST)——ajax基础笔记
2009-10-18 17:24 3972最其名的WEB服务实现是S ... -
8、读取响应头部——ajax基础笔记
2009-10-18 17:20 6707你有时可能需要从服务器获取一些内容,例如,可能想“ping”一 ... -
7、使用JSON向服务器发送数据——ajax基础笔记
2009-10-18 17:20 5132看过前面的例子后(使用XML向服务器发送复杂的数据结构),你可 ... -
6、请求参数作为XML发送——ajax基础笔记
2009-10-18 17:20 1716如果只是使用一个包含 名/值 对的简单查询串,这可能不够健壮, ... -
4、将使用W3C DOM动态生成页面——ajax基础笔记
2009-10-18 17:19 1355使用W3C DOM动态生成页面 dynamicContent ... -
3、将响应解析为XML——ajax基础笔记
2009-10-18 17:18 1010将响应解析为XML parseXML.xml清单: < ... -
2、使用innerHTML属性创建动态内容——ajax基础笔记
2009-10-18 17:17 1863使用innerHTML属性创建动态内容 如果结合作用HTML ... -
1、使用XMLHttpRequest对象——ajax基础笔记
2009-10-18 17:17 1976XMLHttpRequest最早是在 IE5 中以active ... -
30、JavaScript代码优化
2009-10-16 21:25 1517JavaScript代码的速度被分成两部分:下载时间和执行速度 ... -
JavaScript代码优化(二)
2009-10-16 01:32 1151◆字符串的使用 在IE6和IE7中因字符串级联导致的主要问题 ...
相关推荐
函数的构造语法有这三种: Js代码 代码如下: 1.function functionName(arg0, arg1, … argN) { statements }//function语句 2.var function_name = new Function(arg1, arg2, …, argN, function_body);//Function...
JavaScript中箭头函数与普通函数的区别详解 本文为大家讲解了JavaScript中箭头函数与普通函数的区别,供大家参考,具体内容如下 let fun = () => { console.... 箭头函数是匿名函数,不能作为构造函数,不能使用n
function语句不是定义一个新的函数,并且可以定义你的函数动态使用Function()构造使用操作符的唯一途径。 注:这是面向对象编程的术语。第一次可能会感觉不太习惯,这里是没有问题的。 语法 下面是使用new运算符创建...
匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。...Function()构造函数: var fnMethodName = new Function(‘x’,
javascript深入理解函数 函数声明方法 1.function 函数声明语句 ...3.构造函数 Function 关键字 前面参数为函数形参,最后一个参数为返回值 var add = new Function(a,b,return a+b); console.log(add(5,6)); 函数传参
本文实例讲述了JS立即执行的匿名函数用法。分享给大家供大家参考,具体如下: ;(function() {})(); 1.他叫做立即运行的匿名函数(也叫...我们先看看,Function对象能不能直接运 用构造函数创建一个新的函数呢?答案是
1.他叫做立即运行的匿名函数(也叫立即调用函数) 2.当一个匿名函数被括...我们先看看,Function对象能不能直接运 用构造函数创建一个新的函数呢?答案是肯定的。 var abc = new Function(x,y,return x*y;); alert(abc
在JavaScript的世界里,定义函数的方法多种多样,这正是JavaScript灵活性的体现,但是正是这个原因让初学者摸不着头脑,尤其对于.../*第二种方法,使用Function()构造函数克隆函数*/ var F = new Function(“a”,”b”,
3.Function()构造函数: var fnMethodName = new Function(‘x’, ‘alert(x);’) 上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而...
在Javascript定义一个函数一般有如下三种方式: ...’) // 由Function构造函数的参数个数可变。最后一个参数写函数体,前面的参数写入参。 上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常
1. 函数的定义和调用 在JavaScript中,定义函数最常用的方法就是调用function语句。该语句是由function关键字构成的,它后面紧跟的是: Ø 函数名 Ø 一个用括号的参数列表,参数是可选的,参数是用逗号分隔开 Ø ...
Function()构造函数: var fnMethodName = new Function(‘x’,’alert(x);’) 上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这...
函数声明式 function funname( 参数 ){ ...执行的代码 } 声明式的函数并不会马上执行,需要我们调用才会执行:funname(); * 分号是用来分隔可执行...Function 构造函数 代码如下: var myFunction = new Functio
兴致勃勃地定义了下面这么个构造函数: 代码如下: var Coder = function( nick ){ this.nick = nick; }; 定义构造函数结束后呢?没错,赶紧实例化: var coder = Coder( ‘casper’ ); 这个coder兄弟叫什么名字?...
函数语句定义 function(a,b){ return a+b; } 表达式定义 var add = function(a,b){return a+b}; //函数表达式可以包含名称,这在递归时很有用 var f = function fact(x){ if(x<=1) {return 1; }else { return ...
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典... 18.1.3 函数try语句块与构造函数 689 18.1.4 noexcept异常说明 690 18.1.5 异常类层次 693 18.2 命名空间 695 18.2.1 命名空间定义...
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典... 18.1.3 函数try语句块与构造函数 689 18.1.4 noexcept异常说明 690 18.1.5 异常类层次 693 18.2 命名空间 695 18.2.1 命名空间定义...
function 命令后者是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。 使用函数声明的函数在 JS 预解析时具有提升效果,在执行代码之前会先读取函数声明。 function 函数表达式 形式...
return语句为可选,没有return语句的函数返回undefined; 局部变量与全局变量 在函数内声明:局部变量 在函数外声明:全局变量 向一个新变量名赋值时并没有使用var:这个变量会变为新的全局变量 函数可以...
代码如下: function A(x) { this.x = x; } var obj = new A(5);... 其实this代表的就是我们刚刚实例化出来的obj,就相当于我们使用obj去调用了构造函数A里面的属性、方法等等。 那么,我们怎么样去在构