目录
在理解Function之前,我们先回顾下constructor的概念
Function概念
eval( )和Function( )区别
constructor是一个对象的数据属性,创建对象后,访问constructor属性,可以返回构造函数对象的来源,(不是改对象的原型链上级,二者不同),见下面例子:
var a = 1;
a.__proto__
//Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}constructor: ƒ Number()toExponential: ƒ toExponential()toFixed: ƒ toFixed()toLocaleString: ƒ toLocaleString()toPrecision: ƒ toPrecision()toString: ƒ toString()valueOf: ƒ valueOf()[[Prototype]]: Object[[PrimitiveValue]]: 0
a.__proto__.constructor
//ƒ Number() { [native code] }
a.constructor
//ƒ Number() { [native code] }
a.constructor === Number
//true
var b = Number(1);
b.constructor === a.constructor
//true
上面代码中可以看到一部分constructor的特点:
1、变量a的原型链的上级是Number对象(a.__proto__)
2、Number对象的constructor属性和变量a的constructor属性一样,可见a的原型链的上级和constructor属性是包含关系。
3、Number对象的constructor属性值是Number方法,通过Number方法构造出的b,与a的属性相同,因为constructor属性,可以返回构造该对象的来源。
简单来说就是constructor属性就是告诉你这个对象是从哪儿来的。
在javascript中,有时会看到大写的Function,这个和小写的function有本质的区别
function是一个用于定义函数的关键字
Function是代表所有函数的内置原型对象
每一个javascript的function实际上都是Function对象,在控制台运行如下,返回Ture
(function () {}).constructor === Function
Function是javascript内置的对象,Function用以实现很多基础功能,如Number、toString等。
Function( )constructor
Function( )构造器可以构建一个Function对象,可以直接调用Function()构造器动态的创建函数。但是这样会存在类似eval()的隐患和一些功能问题。
eval( )可以访问本地的变量、全局变量
Function( )创建函数时只能执行全局变量
比如eval( )代码执行时可以这样加载module
eval() funvtion
require('fs')
Function( )则需要这样
Function() constructor
global.process.mainModule.require('fs')
Function( )constructor语法
new Function(functionBody)
new Function(arg0, functionBody)
new Function(arg0, arg1, functionBody)
new Function(arg0, arg1, /*... ,*/ argN, functionBody)
Function(functionBody)
Function(arg0, functionBody)
Function(arg0, arg1, functionBody)
Function(arg0, arg1, /*... ,*/ argN, functionBody)