写些关于Javascript函数的东西

来源:互联网 发布:程序员入职第一天 编辑:程序博客网 时间:2024/06/07 00:22
不管我读什么东西,总是容易在不经意间忘掉,严重怀疑脑袋后有漏洞,知识总是漏掉;当然也可能是上高中养成的习惯,必须做笔记写总结才记得住。今儿读到Javascript函数,再记一笔吧!

关于函数直接量:
定义函数有两种方法,一是用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属性,它可以按照数目来获取传递给函数的参数值。

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[]数组改变参数的值会改变参数名称获得的参数值,而用参数名改变一个参数的值同样会改变arguments数组获得的参数值。

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的网站上看了一篇帖子,终于明白了闭包是神马了。
在使用一个东西之前,我们必须知道这屌东西到底有啥用途:首先,它可以读取函数内部的变量;其次,它可以让变量始终保持在内存中。
怎么做到的呢?看一段代码先……

function f1(){

var n = 999;

function f2(){

  alert(n);

}

return f2;

}

var result = f1();

result();

f2在上面的代码中,就是一个闭包,在函数f1中的闭包,它在全局作用域中被引用的时候,可以访问到f1()函数中的局部变量n。
因此,总结:当内部函数在它的作用域的外部被引用时,就创建了该内部函数的闭包。

关于闭包,前辈们总是交代了:闭包不能滥用,否则会占用内存,特别是在IE中容易导致内存泄漏。
关于函数的作用域,没啥好说的,over!

原创粉丝点击