一点arguments.callee的新认识

当我们对JS有了最基本的认识之后,就会了解到JS区别于其他编程语言的区别,那就是没有重载的概念,而当我们需要这个重载功能时,又该如何使用JS做到重载呢?其实我这里并不是想要说明,关于JS中函数重载的问题,而只是arguments.callee的一点新的认识。

1:简略

这里本来想要总结一下可以完成类似重载功能的一些方法的,想了想有觉得没有太大的意义,总起来也就是把数组,对象,甚至函数等,作为参数传入,然后处理即可。所以这里就把该部分省略了,这里只是想说一下对于arguments的一点新的认识,当然,对我来说是新的认识,可是也许您对此早就了然于心了。

2:关于arguments

arguments代表的意义,相信大家都有所了解,这里就简单的举一个例子,就可以了解到arguments的意义了。


function A(){
    console.log(arguments.length);
}

A(1,2,3);      //3
A(1,2,3,4,5,6,7);//7


这样就能理解到了arguments的意思了吧,它最主要的功能就是记录一个函数输入的形参的个数,所以,当A函数有三个参数时,arguments.length = 3,而当A函数的参数是7个时,arguments.length = 7。这里的arguments是一个类数组,那什么是类数组呢,就是这个值有length属性,但也只有这一个和数组一样的属性,同时可以使用数组的取值方法进行操作对应的值,比如可以通过arguments[0]获取函数的第一个参数。但是也只有这些了,像数组使用的pushpop方法,类数组是没有的。当然,我们这里要说的并不是这些,因为这些是我们常用的方法了,相信每一个认真研究过JS的人,都会对这些能很好的应用了。

3:arguments.callee

arguments是一个很有用的对象,但是该对象总起来也就才有三个属性可供我们使用,分别为arguments.length,arguments.caller,arguments.callee,参考:MDN arguments
这里只关心一下arguments.callee属性,该属性也是保存了arguments所在的函数本身,只是一直以来,我都没有觉得这个属性到底有什么用,一直以为,这是一个废掉的属性,同时又看到了ES5中已经在严格模式下,禁用了该属性(arguments.callee)。所以也就更觉得自己的想法是正确的。但是今天看书时,却看到了一个让我感觉眼前一亮,让我重新认识callee的用法。

说到这里,就又得说一个另外一个点,就是我一直认为,自执行函数只要在js文件加载完成之后,就只会执行一次,除非刷新页面。。。。。。今天看到的一段代码,改变了我对js中两个知识点的认识,所以拿来与大家分享一下。

那就先看一段代码吧,也算是我们常用的代码了


var a;
var b;
(function(){
    try{
	b = a.index;
	console.log(b);
    }catch(e){
	console.log("error");
    }
})();
a = {index:1};


类似这样的代码,当然,我这里只是用来举例的,如果能写出这样的代码的话,那只能说明,还有很多的东西需要学习了。可是这里如果这里的,a变量时dom树中的元素呢,比如一些很大的图片,这些东西在开始时,是不会去加载的,也有些东西,是在基本的JS加载之后,才请求加载的,可是就如同上面的代码,在一些元素尚未加载成功前,就执行了这段自执行代码,就导致了页面直接抛出错误。

这个时候,怎么处理呢,把执行的代码添加到onload事件内?可是onload事件会在所有的页面元素加载完之后,才会执行的,而又如果页面内容过多,加载需要很多时间,而之前的这个自执行的函数又是一个很重要的交互,那么这样的处理,就会造成很严重的用户体验问题。

而这里,我们就可以使用callee的方法,避免这个问题的出现,当然还得用上我们异步的核心方法setTimeout了,说到这里,如果您能理解到我前面说话的意思(最近一直在忙些事情,感觉表达叙述能力都下降了,说的都没有什么逻辑了),那么应该也能理解到,这里可以怎么处理了吧。话不多说(感觉已经说了很多废话了,其实直接给代码就好了。。原谅我吧),直接上代码吧:


var a;
var b;
(function(){
    try{
	b = a.index;
	console.log(b);
    }catch(e){
	setTimeout(arguments.callee,100);
	//看这里看这里
	console.log("error");
    }
})();
a = {index:1};


我们可以使用计时器,延时再次执行该自执行函数。。。

OK,这其实就是我说的一个新的认识,对您来说,也许你早已了解到这个问题,也许您也和我一样,算是今天或者看到这里才有的认识,共勉吧。

本文地址:http://www.zhangyunling.com/?p=174

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>