写些关于Javascript函数的东西
来源:互联网 发布:程序员入职第一天 编辑:程序博客网 时间:2024/06/07 00:22
关于函数直接量:
定义函数有两种方法,一是用function语句直接定义,二是使用函数直接量(当然,用函数直接量也会用到function这个单词)。
第一种方法就不用多说了;使用函数直接量的时候,创建的是未命名函数(也可以指定函数名),然后把这个函数直接量赋值给一个变量。
/*函数直接量*/使用函数直接量好处在于:它可以存储在一个变量中,传给其他函数,也可以直接调用。
var f = function(x){return x*x;};
var c = function fact(x){return x*x;};
/*调用函数直接量*/
var f = (function(x){return x*x;})(2);
函数参数:
在javascript中,函数调用时的参数数目可以是任意的,不管在函数定义中的参数名字有多少个。被吓到了,怎么会这么宽松?
当被调用函数的参数少于声明的函数的参数个数的时候,其他的参数值就被赋予undefined的值。
function fact(x,/*optional*/y){
return x;
}
var a = [2,4,6,8];
var result = fact(a);
document.write(result); //输出2,4,6,8,没有什么错误
function fact(x,/*optional*/y){
y = y || []; //若y没有定义,则y为空数组;若y已定义且非空,则返回y。这样可以很灵活地使用可选参数。
for(var key in x){ //要确保可选参数放在参数列表的末尾。若要第一个参数为undefined或null,必须显性的传递
y.push(x[key]);
}
return y;
}
var a = [2,4,6,8];
var result = fact(a);
document.write(result);
可变长度的参数列表:Arguments对象(好像一直没弄懂这个)
Arguments对象是一个类似于数组的对象,但是它不是数组。Arguments对象定义了带编码的数组元素和length属性,它可以按照数目来获取传递给函数的参数值。
arguments[]数组改变参数的值会改变参数名称获得的参数值,而用参数名改变一个参数的值同样会改变arguments数组获得的参数值。function f(){
var m = arguments[0];
for(var i = 1; i < arguments.length; i++){ //arguments类数组对象读取了传递给函数的参数值,并具有length属性,以此来对传进if(arguments[i] > m){ //该函数的参数进行最大值计算,参数列表可变。
m = arguments[i];
}
}
alert(m);
}
f(2,6,8,1,5,9,3,4);
Arguments对象的callee属性:
该属性用来引用当前正在执行的函数,在定义了一个匿名函数时,可以用callee属性来递归调用自身。
function f(x){
if(x <= 0) return 0;
return x + arguments.callee(x-1);
}
alert(f(100));
函数的方法:apply()和call()
这两个方法很强大,使用这两个方法可以像调用其他对象的方法一样调用函数。
如:b.doIt.call(a,1,2); 这段代码意思是:将b对象中的doIt函数指派给a对象,a对象就直接调用了b对象中的doIt方法。
apply()方法和call()类似,只不过传递给函数的参数由数组或者arguments对象指定。如 b.doIt.apply(a, [1,2]);
函数作用域与闭包
据说在这章中,闭包造成了很多人的困扰,读读看先!
在w3cfuns的网站上看了一篇帖子,终于明白了闭包是神马了。
在使用一个东西之前,我们必须知道这屌东西到底有啥用途:首先,它可以读取函数内部的变量;其次,它可以让变量始终保持在内存中。
怎么做到的呢?看一段代码先……
f2在上面的代码中,就是一个闭包,在函数f1中的闭包,它在全局作用域中被引用的时候,可以访问到f1()函数中的局部变量n。function f1(){
var n = 999;
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result();
因此,总结:当内部函数在它的作用域的外部被引用时,就创建了该内部函数的闭包。
关于闭包,前辈们总是交代了:闭包不能滥用,否则会占用内存,特别是在IE中容易导致内存泄漏。
关于函数的作用域,没啥好说的,over!
- 写些关于Javascript函数的东西
- 关于写文章的东西
- 关于javaScript的一些东西
- 关于ppc8260的东西 写的挺好
- 开始写一点关于密码的东西
- 关于写论文的一些东西
- 写点东西,关于XML的
- 写点关于MFC的东西
- 写一些关于数据库的东西
- 关于GC的一写东西
- 写点东西简单理解 javascript 的正则表达式
- javascript写的代理函数
- 应该写点关于python的东西才是
- 最新想写一些关于Linux的东西
- 新开张,写一些关于.net的东西!包括xml
- 开博第一篇,写点关于GPGPU的东西吧
- 写点东西,关于比特币的安全设计:
- 很想写些CMMI的东西
- 多核时代的移动开发(一)-函数式编程思想到来
- 闭合浮动元素(转发)
- [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端二)
- CSS hack(小结)
- Javascript中的关键字this
- 写些关于Javascript函数的东西
- Javascript的类,构造函数和原型
- Javascript的RegExp类型
- sqlite清空表还原自动增长序列
- IOS使用OPENCV实现物体跟踪
- 转Javascript的keyCode
- 调用线程必须为 STA,因为许多 UI 组件都需要
- java.rmi.MarshalException: error marshalling arguments
- Android单元测试 Instrumentation