javascript随心总结 arguments,call与apply

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

相关推荐