[英]Constructor fails on second time, but not first
我有以下代码:
var foo = function () {
foo = this;
foo.boo = function () {
console.log("boo");
}
}
var bar = new foo().boo();
var baz = new foo().boo();
此代码执行第一次创建foo
实例,但在第二次使用以下输出失败:
boo
/Users/BaranSkistad/Code/example.js:9
var baz = new foo().boo();
^
TypeError: foo is not a constructor
at Object.<anonymous> (/Users/BaranSkistad/Code/example.js:9:11)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Function.Module.runMain (module.js:609:10)
at startup (bootstrap_node.js:158:16)
at bootstrap_node.js:578:3
为什么这个脚本失败了? 我知道它是与设置FOO到this
第2行,而不是仅仅使用this
,但它为什么有问题?
var foo = function () {
self = this;
self.boo = function () {
console.log("boo");
}
}
var bar = new foo().boo();
var baz = new foo().boo();
如果我把self
设定为等于this
,那就过去了,为什么会这样呢?
问题出在以下几行
foo = this;
上面的行错过了变量声明。 所以foo
将引用全局变量foo
,它是一个构造函数。当你第一次调用该函数时,该行执行并且foo
被更改为this
( foo
实例)
在第二种情况下,代码还会创建一个全局变量self
,它将与this
相等。 但在这种情况下,它不会改变构造函数,因为名称不同。
解决方法是使用let
(或const/var
)使foo
成为局部变量。
var foo = function () { let foo = this; foo.boo = function () { console.log("boo"); } } var bar = new foo().boo(); var baz = new foo().boo();
虽然你已经得到了答案,但你可能不会明确地设置this
。 如果你在foo
函数中使用console.log
,它将记录一个object
。 相反,你可以只return
一个具有所有内部函数的object
var foo = function() { return { testVal: 5, boo: function() { console.log("boo ", this.testVal); } } } var bar = new foo().boo(); var baz = new foo().boo();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.