一、基础

Function 是一个构造器,能创建Function对象,即JavaScript中每个函数实际上都是Function 对象。

构造方法:  new Function ([arg1[, arg2[, ...argN]],] functionBody)

说明:arg1、arg2等为构造器的参数,functionBody为方法体。注意:参数必须用引号包围!

实例:

var plus=new Function("a","b","return a+b");
var result=plus(1,2);//调用,返回3

上述方法创建function等同于普通函数声明方法:

function plus(a,b){return a+b;};

重点:

1、使用Function构造器生成的对象是在函数创建时解析的(即真正调用时才生成对象的模型),所以比普通函数声明方法低效,因为普通方法是和其它代码一起解析的;

2、此方法不支持闭包,即不能访问创建他的所在function对象的私有变量,而只能访问自身参数列表中的变量和全局变量,因此一般只作为全局函数时使用。如:

<script>
var test=1;//用于测试的全局变量
var plus=new Function("a","b","return a+b+test");
alert(plus(1,2));//将提示结果为4,即访问到了test变量
function adder(value){
var number=value;//定义私有变量
alert("标记1");
this.method=new Function("a","b","return a+b+number");
}
var operation=new adder(1);
alert("标记2");
alert(operation.method(1,2));//提示了标记1与标记2,但此处没结果(出错),若将method的定义中number改为全局变量test,将运行出结果4。可见Function构造器方法确实不能实现闭包。
</script>

二、原型的属性

属性:

1、arguments属性:(已不建议使用)

function.arguments 属性:代表传入函数的实参,它是一个类数组对象。已废弃。例:

function test(var1,var2){
alert(test.arguments[0]+test.arguments[1]);
}

注意:

1)、使用函数名调用;2)、arguments数组访问的是本次函数调用时传入的实参,而非上一次调用时的参数(对于嵌套或循环调用需注意!)。推荐使用函数内部的arguments对象:。

arguments对象:

该对象是函数内部的本地变量,而不是函数的属性。使用示例:

function test(var1,var2){
arguments[0]=0;//可改变参数的值
alert(arguments[0]+arguments[1]);
}
test(1,2);//将提示结果为2

说明:

arguments对象并不是一个真正的Array对象,没有数组的属性与方法(length除外)。可通过继承数组的slice方法获得参数数组:

var args = Array.prototype.slice.call(arguments);  

不建议使用此方法获得参数数组,因为slice方法会影响js引擎的优化(如v8引擎)。最好使用遍历arguments获取参数生成数组。

arguments对象属性:

length、callee等。arguments.callee返回该arguments对象所属的函数构造器(即函数),从而可实现匿名函数的递归等。如:

说明:全兼容。

具体查看:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

2、caller属性:返回调用函数名

例:

说明:全兼容。

3、length:函数期望的参数个数

length 是函数对象的一个属性值,指明该函数期望多少个参数,意即形参的个数。数量不包括剩余参数。相比之下,  arguments.length 是函数被调用时实际传参的个数。

4、name:字符串形式返回函数名

例:alert(test.name);//弹出test函数的函数名test。

注:有的浏览器不支持。

5、prototype:原型,最重要的属性

三、方法

apply()、call()、bind()、toSource()、toString()、isGenerator()六个。

1、apply方法

常用,语法:

B.prototype.method.apply(A [,args]);

作用:

构造器B的原型的method方法(也即B的对象所具有的方法,理解了原型链此处很好理解)提供给对象A,使用,args为需要传入的method的参数,为数组或数组字面量(如[1,2]的形式)。

注意:

B必须为构造器名(即函数名),A为某个将使用此method函数的对象。

示例:

更深细节:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

2、call方法

与apply方法相似,但参数采用参数列表的形式。

语法:

fun.call(thisArg[, arg1[, arg2[, ...]]]) 
此处fun可是任何方法,将fun方法用于thisArg对象,也实现了继承的模拟(thisArg相当于继承了fun方法)。

示例:

上面的Food相当于:

3、bind方法

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])

作用:

将fun方法绑定给thisArg对象。相当于将方法fun写在thisArg的构造器里面,所以fun里面使用到的this此时指的是fun所属的thisArg 对象。

示例:

Function 是引用类型,所以也具有length属性、valueOf与toString 方法。应该将所有function都看做Function 的对象,函数名即该对象的引用!

上面只是基本用法,更多知识参考手册!

参考:

MDN知识库Function属性与方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

Function 构造器及其对象、方法的更多相关文章

  1. jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()

    /*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...

  2. Oracle自定义数据类型 2 (调用对象方法)

    调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create   table   <表名>   of   <对象类型>意义 ...

  3. 翻译:用Javascript的Function构造器伪造上下文 by Ben Nadel

    在我的jQuery模板标记语言(JTML)项目中,我需要一种方式将JTML模板编译到JS函数,这样它们就可以如期地在任何时候转换成新的HTML标记.但这是一个严峻的问题,因为JTML代码涉及非作用域( ...

  4. 25 JavaScript对象原型&ES5新的对象方法

    JavaScript对象原型 所有JavaScript对象都从原型继承对象和方法 日期对象继承自Date.prototype,数组继承自Array.prototype,对象构造器新建的对象Person ...

  5. js 继承 对象方法与原型方法

    js函数式编程确实比很多强语言使用灵活得多,今天抽了点时间玩下类与对象方法调用优先级别,顺便回顾下继承 暂时把原型引用写成继承 先看看简单的两个继承 var Parent = function(){} ...

  6. 学习zepto.js(对象方法)[4]

    今天说说那一套获取元素集合的一些方法: ["children", "clone", "closest", "contents&qu ...

  7. 学习zepto.js(对象方法)[1]

    zepto也是使用的链式操作,链式操作:函数返回调用函数的对象. 但并不是所有的对象方法都可以进行链式操作,举几个例子:.size(),.html()|.text()//不传参数的情况下; 若非特殊说 ...

  8. js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. javascript最新深度克隆对象方法

    javascript最新深度克隆对象方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

随机推荐

  1. sql server time(7) 默认值

    语句为 ALTER TABLE dbo.YourTable ADD CONSTRAINT DF_TimeDefault DEFAULT '00:00:00' FOR YourTimeColumn 比如 ...

  2. Java接口和Java抽象类的认识

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  3. 团体程序设计天梯赛-练习集-L1-034. 点赞

    L1-034. 点赞 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持 ...

  4. mapbox 支持国家2000 坐标系的数据

    最近有个项目使用mapbox作为地图展示,但是mapbox 只支持web 墨卡托(3857)坐标系的数据.而客户想接入其他单位发布的共享数据,共享数据都是基于arcgisserver 发布的国家200 ...

  5. [bzoj1860 ZJOI2006] 超级麻将 (线性dp)

    传送门 Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的 ...

  6. iptables 实现内网转发上网

    介绍 通过iptables做nat转发实现所有内网服务器上网. 操作 首先开启可以上网的服务器上的内核路由转发功能.这里我们更改/etc/sysctl.conf 配置文件. [root@web1 /] ...

  7. 14.Idea在html里面的快捷键

    1.IntelliJ-Idea里常用的快捷键 Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*…*/ ) Shift+F6 重构-重命名 Ctrl+X 删除行 Ctrl+D 复制行 C ...

  8. 2018ICPC南京

    可能上一次秦皇岛拿了银,有了偶像包袱? 打的时候感觉状态不是很好. 第一题,让你每次将连续一段区间的石头都拿掉.. 然后让你做个博弈. 橘子一顿分析,认为k+1的倍数都是输. 这时,我们以及默认i+1 ...

  9. Git学习总结(12)——多人开发 Git 分支管理详解

    1.前言 在上一篇博客中我们主要讲解了Git 远程仓库,相信大家对远程的Git仓库有一定的了解,嘿嘿.在这一篇博客中我们来在大家讲解一下Git 分支管理,这可以说是Git的又一大特点.下面我们就来学习 ...

  10. Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)

    1.前言 对于Long 类型的数据,如果我们在Controller层通过@ResponseBody将返回数据自动转换成json时,不做任何处理,而直接传给前端的话,在Long长度大于17位时会出现精度 ...