文档章节

arguments.callee 调用自身

木子丰
 木子丰
发布于 2014/02/21 16:12
字数 1260
阅读 35
收藏 0
点赞 0
评论 0
一、Arguments
该对象代表正在执行的函数和调用他的函数的参数。
[function.]arguments[n]
参数function :选项。当前正在执行的 Function 对象的名字。
n :选项。要传递给 Function 对象的从0开始的参数值索引。
说明 :Arguments 是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。
Arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际 传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。
在此添加了一个说明arguments不是数组(Array类)的代码:
Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);
function testAguments(){
               alert(arguments.selfvalue);
}
运行代码您会发现第一个alert显示1,这表示数组对象拥有selfvalue属性,值为1,而当您调用函数testAguments时,您会发现显示的是“undefined”,说明了不是arguments的属性,即arguments并不是个数组对象。

二、caller

返回一个对函数的引用,该函数调用了当前函数。
     functionName.caller
     functionName 对象是所执行函数的名称。
说明:对于函数来说,caller 属性只有在函数执行时才有定义。假如函数是由顶层调用的,那么 caller 包含的就是 null 。假如在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 相同,也就是说,显示的是函数的反编译文本。
下面的例子说明了 caller 属性的用法:
function callerDemo() {
   if (callerDemo.caller) {
           var a= callerDemo.caller.toString();
           alert(a);
  } else{
       alert("this is a top function");
  }
}
function handleCaller() {
       callerDemo();
}
三、callee
返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。
说明:callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,他表示对函数对象本身的引用,这有利于匿名函数的递归或确保函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。更有需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参度,arguments.callee.length是形参长度,由此能够判断调用时形参长度是否和实参长度一致。

//callee能够打印其本身
function calleeDemo() {
   alert(arguments.callee);
}
//递归计算
var sum = function(n){
   if (n <= 0) return 1;
   else return n +arguments.callee(n - 1)
}
比较一般的递归函数:
var sum = function(n){
   if (1==n) return 1;
   else return n + sum (n-1);
}
调用时:alert(sum(100));
其中函数内部包含了对sum自身的引用,函数名仅仅是个变量名,在函数内部调用sum即相当于调用一个全局变量,不能很好的体现出是调用自身,这时使用callee会是个比较好的方法。

四、apply and call
他们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区分:
         apply(thisArg,argArray);
         call(thisArg[,arg1,arg2…] ]);
即任何函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的
apply的说明:假如 argArray 不是个有效的数组或不是 arguments 对象,那么将导致一个 TypeError。
假如没有提供 argArray 和 thisArg任何一个参数,那么 Global 对象将被用作 thisArg,并且无法被传递任何参数。
call的说明:call 方法可将一个函数的对象上下文从初始的上下文改变为由thisArg指定的新对象。
假如没有提供thisArg参数,那么Global对象被用作thisArg
相关技巧:应用call和apply有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,当前的
函数(类)就具备了另一个函数(类)的方法或是属性,这也能够称之为“继承”。看下面示例:

// 继承的演示
function base() {
   this.member = " dnnsun_Member";
   this.method = function() {
         window.alert(this.member);
   }
}
function extend() {
   base.call(this);
   window.alert(member);
   window.alert(this.method);
}
上面的例子能够看出,通过call之后,extend能够继承到base的方法和属性。
顺便提一下,在javascript框架prototype里就使用apply来创建一个定义类的模式,
其实现代码如下:
var Class = {
   create: function() {
       return function() {
           this.initialize.apply(this, arguments);
       }
   }
}
解析:从代码看,该对象仅包含一个方法:Create,其返回一个函数,即类。但这也同时是类的构造函数,其中调用initialize,而这个方法是在类创建时定义的初始化函数。通过如此途径,就能够实现prototype中的类创建模式

本文转载自:http://blog.sina.com.cn/s/blog_616acf520100nosr.html

木子丰
粉丝 17
博文 236
码字总数 68754
作品 0
郑州
程序员
javascript Arguments对象之length、callee属性

1、length属性,我们可以利用Arguments对象的length属性来获取实际传递进的参数有几个。 function a(x, y, z) { //arguments.callee指向函数a(),arguments.callee.length==a.length; alert(...

Adam-Lee
2014/07/21
0
0
JavaScript函数中的arguments对象

ECMAScript标准中,每个函数都有一个特殊的内置对象arguments。arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本。 一、内置特性 说它是一个内置对象是因为我们在创建函...

JasonWcx
2014/12/29
0
5
函数和函数的作用域问题,arguments

this的值:在函数执行时,this关键字并不会指向正在运行的函数本身,而是指向调用该函数的对象.所以,如果你想在函数内部获取函数自身的引用,只能使用函数名或者使用argument.callee属性(严格模...

leona_lily
2015/08/05
0
0
js生成随机颜色

js生成随机颜色 方法一: var getRandomColor = function(){ return '#' + (function(color){ return (color += '0123456789abcdef'[Math.floor(Math.random()*16)]) && (color.length == 6......

writeademo
2016/10/19
30
0
js中的可变参数

每天成长一点,多年以后你会发现你很牛。 使用javascript类库函数时,经常会遇到一个函数,可以使用不同个数的参数的情况 比如:exp(var1) exp(var1, var2) 但是在实际编写javascript函数时,...

AntMoon
2016/03/21
14
0
JavaScript里function函数实现可变参数(多态)

使用javascript类库函数时,经常会遇到一个函数,可以使用不同个数的参数的情况 比如:exp(var1) exp(var1, var2) 但是在实际编写javascript函数时, 函数不能同名,所以不可能是不同参数个数...

鉴客
2011/02/13
33.5K
3
JavaScript 中使用多态

使用javascript类库函数时,经常会遇到一个函数,可以使用不同个数的参数的情况 比如:exp(var1) exp(var1, var2) 但是在实际编写javascript函数时, 函数不能同名,所以不可能是不同参数个数...

SeanCai
2010/11/29
0
0
js中arguments的作用

在javascript函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象。 Arugments对象就像数组,注意这里只是像并不是哈。 javascript函数体内,argum...

Sherlock_z
2014/10/31
0
0
angularJs指令详解

ng-repeat指令 ng-repeat指令的作用: 遍历集合 通过in的方式遍历每一项。类似vue.js中的v-for Title

qianxing111的博客
2017/12/19
0
0
【JavaScript】关于闭包

1、闭包是函数的代码在运行过程中的一个动态环境,是一个运行期的、动态的概念。 闭包(又称“词法闭包”或“函数闭包”)是一个包含了非本地变量引用环境的函数。 2、变量在语法分析阶段被初...

Aram
2013/03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
9分钟前
0
0
中国开始生产自主设计x86 CPU,由AMD授权

导读 7 月 10 日报道,美媒称,中国正试图摆脱对美国公司的依赖并开发自己的芯片。据报道,中国制造商天津海光先进技术投资有限公司开始生产中国自主设计的“禅定”x86 中央处理器(CPU)。 ...

问题终结者
10分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
17分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
22分钟前
0
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
0
0
继社会佩奇之后,又尝试了可爱的蓝胖子,有趣 Python

#哆啦A梦# !/usr/bin/env python3# -*- coding: utf-8 -*-# @Author: dong dong# @Env: python 3.6from turtle import *# 无轨迹跳跃def my_goto(x, y): penup(...

Py爱好
昨天
0
0
shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
昨天
0
0
upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部