JS特殊函数(Function()构造函数、函数直接量)区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS特殊函数(Function()构造函数、函数直接量)区别相关的知识,希望对你有一定的参考价值。
参考技术A函数定义
函数是由这样的方式进行声明的 关键字 function 函数名 一组参数 以及置于括号中的待执行代码
函数的构造语法有这三种
Js代码
代码如下:
function functionName(arg arg argN) statements //function语句
var function_name = new Function(arg arg argN function_body);//Function()构造函数
var func = function(arg arg argN) statements ;//函数直接量
示例
Js代码
代码如下:
function f(x)return x*x;//function语句
var f = new Function("x" "return x*x;");//Function()构造函数
var f = function(x)return x*x;;//函数直接量
如果函数无明确的返回值 或调用了没有参数的 return 语句 那么它真正返回的值是 undefined
Function()构造函数
函数实际上是功能完整的对象 Function类可以表示开发者定义的任何函数 用Function类直接创建函数的语法如下
var function_name = new function(arg arg argN function_body)
在上面的形式中 每个 arg 都是一个参数 最后一个参数是函数主体(要执行的代码) 这些参数必须是字符串
var sayHi = new Function("sName" "sMessage" "alert( Hello + sName + sMessage);");
sayHi("jzj " "你好!");//Hello jzj 你好!
函数名只是指向函数的变量 那么可以把函数作为参数传递给另一个函数吗?答案是可以的 请看
Js代码
复制代码 代码如下:
function callAnotherFunc(fnFunction vArgument)
fnFunction(vArgument);
var doAdd = new Function("iNum" "alert(iNum + )");
callAnotherFunc(doAdd ); //输出 " "
注意 尽管可以使用 Function 构造函数创建函数 但最好不要使用它 因为用它定义函数比用传统方式要慢得多 不过 所有函数都应看作 Function 类的实例
如果你定义的函数没有参数 那么可以只需给构造函数传递一个字符串(即函数的主体)即可
注意 传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名 用Function()构造函数创建的未命名函数有时被称为“匿名函数”
Function()函数允许我们动态地建立和编译一个函数 它不会将我们限制在function语句预编译的函数体中
函数直接量
函数直接量是一个表达式 它可以定义匿名函数 函数直接量的语法和function语句非常相似 只不过它被用作表达式 而不是用作语句 而且也无需指定函数名 语法
Js代码
代码如下:
var func = function(arg arg argN) statements ;//函数直接量
虽然函数直接量创建的是未命名函数 但是它的语法也规定它可以指定函数名 这在编写调用自身的递归函数时非常有用 例如
Js代码
代码如下:
var f = function fact(x)
if (x <= )
return ;
else
return x * fact(x );
;
注 它并没有真正创建一个名为fact()函数 只是允许函数体用这个名字来引用自身 javascript 之前的版本中没有正确实现这种命名的函数直接量
•函数引用
函数名并没有什么实质意义 它不过是用来保存函数的变量名字 可以将这个函数赋给其他变量 它仍然会以相同方式起作用
Js代码
代码如下:
function square(x)return x*x;
var a = square;
var b = a( );//b 为
这有点像C++中的函数指针了
Function()构造函数和函数直接量差别
Function()构造函数和函数直接量之间的差别有一点就是 使用构造函数Function()创建的函数不使用词法作用域 相反的 它们总是被顶级函数来编译 如
Js代码
代码如下:
var y = "global";
function constructFunction()
var y = "local";
//Function()构造函数
return new Function("return y;");//不使用局部作用域
function constFunction()
var y = "local";
//函数直接量
var f = function ()
return y;//使用局部作用域
;
return f;
//显示 global 因为Function()构造函数返回的函数并不使用局部作用域
alert(constructFunction()());
//显示 lobal 因为函数直接量返回的函数并使用局部作用域
lishixinzhi/Article/program/Java/JSP/201311/20095
js_原型链的问题
所有的构造函数都是构造函数Function的实例(允许该构造函数直接通过constructor属性访问构造函数Function)
所有的原型对象都可以近似看成构造函数Object的实例(不允许该原型对象直接通过constructor属性访问构造函数Object)
示例:
判断构造函数、实例对象、原型对象之间的关系
现有构造函数Foo,其实例对象foo,其原型对象Foo.prototype。还有Function构造函数,Object构造函数
var l = console.log;
function Foo() {}
var foo = new Foo();
//Foo构造函数
l(foo.constructor == Foo); //true
l(Foo.prototype.constructor == Foo); //true
l(foo.__proto__ == Foo.prototype); //true
//Function构造函数
l(new Function().constructor == Function); //true
l(Function.prototype.constructor == Function); //true
l(new Function().__proto__ == Function.prototype); //true
//Object构造函数
l(new Object().constructor == Object); //true
l(Object.prototype.constructor == Object); //true
l(new Object().__proto__ == Object.prototype); //true
- 所有的构造函数都可以通过prototype属性访问其原型对象。
- 所有的原型对象都可以通过constructor属性访问其构造函数。
- 所有的实例对象都可以通过constructor属性访问其构造函数。
- 所有的实例对象都可以通过__proto__属性访问其原型对象。
Object构造函数与Function构造函数之间的联系
所有的构造函数都是构造函数Function的实例(允许该构造函数直接通过constructor属性访问构造函数Function)
所有的原型对象都可以近似看成构造函数Object的实例(不允许该原型对象直接通过constructor属性访问构造函数Object)
//所有的构造函数都是构造函数Function的实例(允许该构造函数直接通过constructor属性访问构造函数Function)
l(Object.constructor == Function); //true
l(Object.__proto__==Function.prototype);//true
//所有的原型对象都可以近似看成构造函数Object的实例(不允许该原型对象直接通过constructor属性访问构造函数Object)
l(Function.prototype.__proto__ == Object.prototype); //true
l(Function.prototype.constructor == Object);//false
- 构造函数Object可以通过__proto__属性访问Function.prototype,也可以通过constructor属性访问Function构造函数。
- 原型对象Function可以通过__proto__属性访问Object.prototype,但不可以通过constructor属性访问Object构造函数。
- 综上,可以完全将所有构造函数看做构造函数Function的实例,但只能将原型对象近似看做Object构造函数的实例。因为对象只能与对象之间通过__proto__进行直接访问,以此形成了原型链。
以上是关于JS特殊函数(Function()构造函数、函数直接量)区别的主要内容,如果未能解决你的问题,请参考以下文章