新功能是否有任何错误?

时间:2017-03-12 02:33:48

标签: javascript node.js

我已阅读Function。所以我尝试通过 new Function 函数声明转换为函数表达式。但是,我被困在下面的代码中:

function Foo(name, age) {
    Foo.prototype.name = name;
    Foo.prototype.age  = age;
}
var foo = new Foo(1,2); // this is ok
console.log(Foo.prototype.hasOwnProperty('name'));
console.log(foo.hasOwnProperty('name'));

但转换后出现错误:

var Foo = new Function(['name', 'age'], 'Foo.prototype.name=name;Foo.prototype.age=age;');
var foo = new Foo(1,2); // error: Foo is not defined 
console.log(Foo.prototype.hasOwnProperty('name'));
console.log(foo.hasOwnProperty('name'));

有什么错吗?任何答案都有帮助。

代码就在我的Chrome浏览器中。但是它在平台上出错:

  • nodejs:6.10.0
  • win7 64bit

1 个答案:

答案 0 :(得分:1)

错误是因为var Foo未定义Function可以到达的位置,至少在使用Node时没有。

使用new Function()构造函数从字符串创建函数时,该函数只能访问全局范围,无论它在何处创建。

而且,在Node模块中,var Foovar foo不是全局变量。它们是仅存在于当前文件/模块中的“模块”范围内的局部变量。

var bar = 'bar';
console.log(bar);        // function
console.log(global.bar); // undefined

要允许new Function()访问Foo,您必须将后者定义为全局变量(或global对象的属性)。

global.Foo = new Function(['name', 'age'], 'Foo.prototype.name=name;Foo.prototype.age=age;');
var foo = new Foo(1,2);
// ...
  

尽管如此,你应该知道修改这样的全局范围/对象在Node中通常是不受欢迎的,因为这违背了它使用隔离模块的意图/设计。

但是,要从表达式定义函数,您不需要使用Function构造函数。您可以改为place the declaration where an Expression is expected,例如在赋值运算符之后。

var Foo = function (name, age) {
    Foo.prototype.name = name;
    Foo.prototype.age  = age;
};
var foo = new Foo(1,2); // this is ok
// ...