//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原生的一些方法不允许修改,想证明就是不行呢
//到此结束