<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <script language="javascript"> var hello = 'Hello '; var welcome = ', welcome!'; function say(msg){ alert(msg); } /** *默认this指针指向window对象 */ window['name'] = 'window'; function say_1(arg1,arg2) { say(arg1 + this.name + arg2);//此时的this为window对象 }; /* 以下调用输出: Hello window, welcome! */ say_1(hello, welcome); /** *call方法 1、作用:call方法用来改变this指针所指向的对象,只有Function对象才有call方法,Function调用call后,Function中的this都指代传入的obj对象 2、用法:Function.call(obj, arg1, arg2, ... ,argn); 3、arg1, arg2, ... ,argn为传给Function的参数。 */ function say_2(arg1,arg2) { say(arg1 + this.name + arg2);//此时的this为obj_1对象 }; var obj_2 = {}; obj_2.name = "obj_2"; /* 以下调用输出: Hello obj_2, welcome! */ say_2.call(obj_2, hello, welcome); /** *apply方法 1、作用和call方法相同,只是用法有差异; 2、用法:Function.apply(obj, argsArray),argsArray为Array对象,其元素将作为参数依次传给Function。 */ function say_3(arg1,arg2) { say(arg1 + this.name + arg2);//此时的this为obj_1对象 }; var obj_3 = {}; obj_3.name = "obj_3"; /* 以下调用输出: Hello obj_3 welcome! */ say_3.apply(obj_3, new Array(hello, welcome)); /** *arguments对象 1、作用:arguments只存在于Function体内,是一个Arguments对象,像数组,有length属性(注意:并不是真的数组,不是Array对象)。它把所有传给Function的参数按照数组的格式存储。 */ function say_4() { say(arguments[0] + this.name + arguments[1]);//此时的this为obj_4对象 }; var obj_4 = {}; obj_4.name = "obj_4"; /* 以下调用输出: Hello obj_4 welcome! */ say_4.apply(obj_4, new Array(hello, welcome)); /** *arguments的callee属性 1、作用:callee用来引用当前正在执行的函数(arguments必须在函数体内),这能让未命名的函数进行自调用; 2、用法:arguments.callee(arg1, ... , argn) */ var say_5 = function() { if(arguments.length < 1){ return ''; }else{ /* *注意: *1、arguments.callee指向匿名函数本身; *2、this指针指向window对象,在这里并无太多意义,只是充个参数而已 */ return arguments[0] + arguments.callee.apply(this, Array.prototype.slice.call(arguments,1)); } }; /* 以下调用输出: Hello obj_5 welcome! */ say( say_5( hello, 'obj_5', welcome) ); /** *Function的caller属性 1、作用:caller指向调用该函数的函数; 2、用法:Function.caller(arg1, ... , argn) */ function say_6(arg1){ if(say_6.caller){ say_6.caller(arg1); } else { say('say_6 saying: ' + hello + arg1 + welcome); } } function say_7(){ if(arguments.length > 0){ say('say_7 saying: ' + hello + arguments[0] + welcome); }else{ say_6('obj_6'); } } /* 以下调用输出: say_6 saying: Hello obj_6 welcome! */ say_6('obj_6'); /* 以下调用输出: say_7 saying: Hello obj_6 welcome! */ say_7(); /* 以下调用输出: say_7 saying: Hello obj_7 welcome! */ say_7('obj_7'); </script> </body> </html>