我已阅读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浏览器中。但是它在平台上出错:
答案 0 :(得分:1)
错误是因为var Foo
未定义Function
可以到达的位置,至少在使用Node时没有。
使用new Function()
构造函数从字符串创建函数时,该函数只能访问全局范围,无论它在何处创建。
而且,在Node模块中,var Foo
和var 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
// ...