//js杂谈 //主要想到什么就写下来 //测试的版本还是chrome 多少忘了 //第一个arguments //第一个作用 var toString={}.toString; var slice=[].slice; function aa(){ console.info(arguments.callee);//返回的是这函数aa引用 //下面两个证明他是非常像数组 console.info(arguments); console.info(arguments.length); //为什么不是数组呢 console.info(toString.call(arguments));//[object Arguments] 到此如何 //转化为数组//突然想到为什么能转化数组- -,写着写着就想到了这个 console.info(slice.call(arguments)); console.info(toString.call(slice.call(arguments)));//[object Array] } aa(); //有什么用呢,递归有用 //1-n的乘法 function bb(n){ if(n==1){ return 1; } return n*arguments.callee(n-1); } console.info(bb(5));// 是不是特别像数组 但不是真正的数组 //还有strict mode ,会被禁用,不过严格模式在火狐下会有bug //第二个 看过我以前写的博客的朋友,都应听到类数组这个东东 //像数组的对象 aa("a","b","c","d"); //好吧我们将其变为真的数组 //我记得在数组总结中有这样的方法slice //当然根据arguments可实现像java这样的重载功能 //就是根据arguments参数长度,和其值执行不同的操作 //不地感觉怎么就是感觉不妥 = = //第二个就是call 与apply //二者有一个不同,就是第一个要一个一个的传参,第二个可以传个arguments //传参不是这两个函数的真面目 //可以随时函数执行的上下文环境 是不是很厉害 var x="window"; var obj1={ x:"xx", xxxx:window.alert, xx:function(){ alert(this.x); }, xxx:function(){ //alert(this);//object alert(x); } }; var obj2={ x:"xx2", xx:function(){ alert(this.x); }, xxx2:function(){ alert(x); } }; //看变化 obj1.xx(); obj1.xx.call(this); obj1.xx.call(obj2); //再来三个,有什么差别 //obj1.xxx(); //obj1.xxx.call(this); //obj1.xxx.call(obj2); //弹出来都是window //alert方法在window,所以这个上下文 //上下文环境由调用时决定 //感觉也可以离解为一个方法里又包了一个alert函数,由闭包的意思,所以上下文为window //若有错误请指出 var a=window.alert; console.info(a); //a.call(obj1,x);//我想是js原生的一些方法不允许修改,想证明就是不行呢 //到此结束