函数的学习
1.函数的参数是可变长的,这个较简单一般没人忘掉。
例如:
function main(arg1,arg2){
alert(arg1);
}
调用时可以传递多个参数,例如 main(1,2,3);
2.js函数是不能重载的。
3.命名空间
JS本没有命名空间一说,只是大家为了OO给模拟类似的功能。
例如:
var com = {};
var com.test.util = {};
只是对象一层层的叠加而已。
4.函数的嵌套
例如 :
var outname = "外面";
function outerFn(){
var innerName = "内部";
function innerFn(){
alert(outname+"--"+innerName);
}
return innerFn;
}
var cache = outerFn();
cache();
如上面的例子调用cache()方法后,按说innerName已经不再作用域了,但是还能正常访问,我记得犀牛书中有句话是这样说的“js的变量是在定义它的作用域,不是在 运 行时的作用域”,通过这句话可以很好的解释为什么innerName还能使用。
5.函数既是数据也是对象
var myFn = function fn(){
alter("test");
}
alert(myFn);
运行结果就是把该函数通过toString()方法,打印出来函数代码。此时函数就是看成string字符串。
var fn = new Function('x','y','alert("test")');
alert(fn instatnceof Object);
fn();
运行结果就是true,然后是test;Function规则是最后一个参数是函数体。但是据说这种执行效率很慢,通过eval()执行的时候也是这种方式所以效率很慢。
6.函数的实例属性
函数的实例属性有 arguments,callee .caller 、length 、 prototype
arguments 指实际传递的参数,具有类似数组的特性,arguments[0],arguments[1],是指获取对应的第一个,第二参数,但是arguments实际不是一个数组。
callee熟悉是在arguments定义,用来只想函数自己,主要用于递归,例如
function fn(n){
if(n==1) {
return 1;
}else{
return n*arguments.callee(n-1);
}
}
caller 是指函数的调用者。
prototype 是函数非常重要的属性。
注意的是:函数、原型、实例之间的关系,构造函数都用一个属性是prototype,而prototype都有一个属性指向构造函数,函数的实例则都有个一个属性指向prototype。
这也是继承机制实现的基础。
7.函数的作用域问题
函数的执行过程:
(1)创建活动对象,函数运行之前js执行环境会创建一个活动对象。
(2 ) 分配作用域链。
(3)绑定this