[教程]JScript中的变量引用规则(补充,函数用法说明) by http://www.lostinet.com/,http://lostinet.d2g.com
第一篇:http://www.csdn.net/expert/topic/787/787738.xml
我高考语文才496分啊,,,惨。。现在要说些什么,都不知道。。。 还是用例子开始吧:不过例子和分析,现在写在一起了。
这个只是补充说明,看不看都没有关系。不会的还是看看好:)
2。1 -》函数被传递 {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- var func=function(){alert("ok")}; function CallFunc(f) { f(); } CallFunc(func); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---} 一般的应用中,传递函数是很少见的。但是对于很多动态的应用,传递函数就很正常了。 这个例子,func是一个函数。CallFunc(func)时,把func传递给CallFunc中的f 所以在 function CallFunc(f) { f(); } 中,f是一个函数。所以调用f()是可以的。实际上就是调用function(){alert("ok")};
2。2 -》函数作为方法 {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- var obj={};//var obj=new Object(); obj.value=14; var func=function(number){alert(this.value+number)}; obj.alert=func; obj.alert(25); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}
这个例子,说明了函数作为一个对象的方法,是怎样使用的。 this是一个特殊的变量,它是一个参数。 当执行obj.alert(25)时, 其实是执行function(number){alert(this.value+number)}; 而这个过程中obj也传递过去了,化身为this。 这个过程大家都比较了解,所以也不多说了。 要执行对象的方法,只有两个途径: 一:obj.method(); 必须有一个“.”的存在。 二:func.apply(obj,args),func.call(obj,arg1,arg2...),这个需要JScript5.5的支持。
2。3 -》函数作为方法,2 {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- var obj={};//var obj=new Object(); obj.value=14; var func=function(number){alert(this.value+number)}; obj.alert=func; var method=obj.alert method(4); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}
为什么显示NaN呢? 虽然method=obj.alert,但是传递的,却只是obj["alert"]本身,即func 所以在执行func中,没有隐含的对象传过去给this this没有被赋值,在IE中默认是window,在其他变量空间就依赖有this的空间来判断
2。4 -》函数作为对象使用。 {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- function aaa() { alert(this); } function aaa.bbb() { alert(this); } var func=function(){}; func.bbb=aaa; func.bbb(); func.bbb.bbb(); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---} 我没有精神了,你自己理解吧。。
2。5 -》函数作为对象使用2。 {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- function func(){}; function func.a(){return "a"}; function func.b(){return "b"}; function func.c(){return "c"}; for(var i in func)alert(func[i]()); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}
2。6 -》caller {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- function Func() { alert(Func.caller); } function CallFunc() { alert(CallFunc.caller); Func(); } CallFunc(); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---} 因为CallFunc()是全局执行的,所以没有函数调用CallFunc,所以CallFunc.caller为null 而在Func,是由CallFunc调用的,所以第二次显示CallFunc
2。7 -》不依赖名字,在函数中取函数本身 {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- function CallFunc() { alert(CallFunc); var fs=function(fs){return fs.caller}; fs=fs(fs); alert(fs); } CallFunc(); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---} 第一次alert是做个示范。这个是直接引用CallFunc的。 var fs定义了一个很特殊的函数。 当执行fs=fs(fs)时,就取回fs的调用者CallFunc,所以fs引用了CallFunc了
2。8 -》arguments {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- function alertBatch() { var args=alertBatch.arguments; var arr=[]; for(var i=0;i<args.length;i++) arr[i]=args[i]; alert(arr.join("")); } alertBatch(1,"a",2,"b",3,"c",4,"d",5,"e"); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---} alertBatch.arguments是调用该函数的参数的数组(不是Array) 根据这个,函数可以处理多个参数的情况。
2。9 -》Function.prototype.toString {---{---{---{---{---{---{---{---{---{---{---{---{---{---{---{--- function Function.prototype.toString() { return "object Function"; } function func() { } alert(func); ---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}---}
函数的其他方面就不多说了。JScript的参考书都有说明。

|