Function
Function 构造函数创建一个新的Function
对象。 在 JavaScript 中, 每个函数实际上都是一个Function
对象。
1 | let fn = new Function ([arg1[, arg2[, ...argN]],] functionBody); |
1 | let sum = new Function('a', 'b', 'return a + b'); |
注:
以调用函数的方式调用Function 构造函数,跟以构造函数来调用是一样的
使用Function 构造函数生成的
Function
对象是在函数创建时解析的。这比使用函数声明或者函数表达式并在代码中调用更为低效,因为使用后者创建的函数是跟其他代码一起解析的。使用Function 构造函数生成的函数,并不会在创建它们的上下文中创建闭包,它们一般在全局作用域中被创建。当运行这些函数的时候,它们只能访问自己的本地变量和全局变量,不能访问Function 构造函数被调用生成的上下文的作用域。这和使用带有函数表达式代码的
eval
不同。1
2
3
4
5
6
7
8
9
10// 1、f()函数返回的function e()是闭包.
var n = 1;
function f(){
var n = 2;
function e(){
return n;
}
return e;
}
console.log (f()()); // 21
2
3
4
5
6
7
8// 2、f()函数返回的function e()是全局作用域函数
var n = 1;
function f(){
var n = 2;
var e = new Function("return n;");
return e;
}
console.log (f()()); // 1
eval
eval()
函数会将传入的字符串当做 JavaScript
代码进行执行。
1 | var value = eval(string); |
返回值:
返回字符串代码的返回值,如果返回值为空,则返回
undefined
如果
eval()
的参数不是字符串,eval()
会将参数原封不动地返回
注意:
如果你间接的使用
eval()
,而不是直接的调用eval
。 从ECMAScript 5
起,它工作在全局作用域下,而不是局部作用域中。1
2
3
4
5
6
7
8
9
10
11
12
13
14function test() {
var x = 2, y = 4;
// 直接调用,使用本地作用域
console.log(eval('x + y')); // 6
// 等价于在全局作用域调用
var geval = eval;
// 间接调用,使用全局作用域
console.log(geval('x + y')); // throws ReferenceError 因为`x`未定义
// 另一个间接调用的例子
(0, eval)('x + y');
}eval
中函数作为字符串被定义需要(
和)
作为前缀和后缀1
2
3
4let fctStr1 = 'function a() {}'
let fctStr2 = '(function a() {})'
let fct1 = eval(fctStr1) // 返回undefined
let fct2 = eval(fctStr2) // 返回一个函数