`
carge
  • 浏览: 50367 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

javascript中call、apply、argument、callee、caller解析

 
阅读更多

 

<!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>

 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics