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

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>

 


分享到:
评论

相关推荐

    理解JavaScript的caller,callee,call,apply

    ### 理解JavaScript中的`caller`, `callee`, `call`, `apply` #### Arguments对象 在深入了解`caller`, `callee`, `call`, 和 `apply` 之前,我们先来看看`arguments`对象。`arguments`对象是在JavaScript函数内部...

    理解Javascript的caller,callee,call,apply区别

    ### 理解JavaScript中的`caller`, `callee`, `call`, `apply`的区别 #### 一、`arguments`对象 在深入探讨`caller`, `callee`, `call`, 和`apply`之前,我们先来了解一个重要的概念——`arguments`对象。 **`...

    javascript利用apply和arguments复用方法

    JavaScript中的`apply`和`arguments`对象是两个非常重要的特性,它们在函数复用和处理动态参数时起着关键作用。本文将详细讲解这两个概念及其在复用方法中的应用。 `apply`是JavaScript中Function对象的一个方法,...

    IE8提示Invalid procedure call or argument 异常的解决方法

    这个异常主要发生在JavaScript中,尤其是在使用某些函数或者方法时,传递的参数不符合要求。 在描述中提到的案例里,问题出现在使用了document.body.querySelectorAll方法获取到一个元素集合,然后尝试访问其超出...

    王老师Argument解析1

    在“王老师Argument解析1”中,王老师强调了新GRE Argument写作的两个关键点: 1. **避免直接使用flawed或dubious等词**:与老版GRE相比,新GRE Argument的评估不再仅仅关注错误的识别,而是要求考生对论证进行深入...

    js代码-手写call apply

    在JavaScript的世界里,`call`和`apply`是两种非常重要的函数调用方式,它们都是Function对象的方法,用于改变函数内部的`this`值。理解并掌握这两种方法对于深入学习JavaScript和提升编程能力至关重要。 首先,`...

    JavaScript 学习笔记(九)call和apply方法

    call和apply方法 call方法可改变上下文this指针,类似的方法还有apply,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。 obj1.method1.call(obj2,argument1,...

    iOS-Null passed to a callee that requires a non-null argument警告

    Null passed to a callee that requires a non-null argument 此警告就是某属性说好的不能为空,你又在某地方写了XX = nil 所以冲突了 这个警告比较新,是xcode6.3开始 为了让OC也能有swift的?和!的功能,你在声明...

    Argument逻辑纠错作业解析1

    【Argument逻辑纠错作业解析】 在这份逻辑纠错作业中,我们主要关注的是常见的逻辑错误类型,如绝对化词汇、因果关系错误、时间点误用、样本质量问题等。这些错误经常出现在逻辑推理题中,掌握它们有助于提升解题...

    Javascript基础教程之argument 详解

    argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 代码如下: [removed]  function sayHello () {  if (arguments[0] == “bye”)  return;  else  alert&#40...

    js中call()和apply()改变指针问题的讲解

    1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。(天生的) 2. 相同点:这两个方法的...区别:call和apply的区别在于call的第二个参数可以是任意类型,而apply的第二个参数必须是数组或者argument

    解决yolov3_object_tracking中loop of ufunc does not support argument 0 of type Tensor which has问题

    TypeError: loop of ufunc does not support argument 0 of type Tensor which has no callable arctan method 报错行 self.u = np.round(np.dot(self.F, self.u)) #或者 self.u = np.round(self.u + np.dot(K, ...

    javascript基础知识总结

    JavaScript是Web开发中的基础脚本语言,用于实现客户端的交互功能。以下是对JavaScript基础知识的总结,主要关注在网页中使用的弹出对话框、函数调用以及带有参数的函数。 1) Alert Box `alert()` 函数用于显示一个...

    node-cli-argument-parser:自动解析传递的字符串数组并创建一个对应的对象

    `node-cli-argument-parser`是一个专门用于解析Node.js CLI应用中传递的字符串数组,并将其转化为易于处理的对象的工具。这个库可以帮助开发者更高效地管理和理解用户在命令行中输入的参数。 在JavaScript的世界里...

    JavaScript中Function详解

    JavaScript中的Function是编程的核心组成部分,它允许我们定义可重复使用的代码块,以便在需要时执行特定的任务。在JavaScript中,函数既是一种数据类型,也是一种执行上下文。它们可以通过两种方式定义:函数声明式...

    Argument分类--按错误类型

    在探讨GRE考试中的Argument部分时,我们关注的焦点在于识别并分析论证中的逻辑错误和漏洞。根据给定的文件信息,我们可以将Argument的错误类型大致分为以下几类:基于当前或过去条件推断未来状况、解决方案的充分性...

    µVISION: Error: Encountered an improper argument

    标题中的"µVISION: Error: Encountered an improper argument"是一个在使用Keil µVision集成开发环境时可能会遇到的问题提示。这个错误通常意味着在执行某些操作或者仿真过程中,软件遇到了无法识别或者不合法的...

    fragment argument

    在"CriminalIntent"这个项目中,Fragment argument可能用于在CrimeFragment中传递犯罪的相关信息,如犯罪ID、标题、日期等,使得每个CrimeFragment能够正确显示和处理与其关联的犯罪详情。理解并熟练使用Fragment ...

Global site tag (gtag.js) - Google Analytics