我有以下代码:
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
为什么该脚本失败?我知道这与在第2行上将foo设置为this
有关,而不仅仅是使用this
,但是为什么会有问题?
var foo = function () {
self = this;
self.boo = function () {
console.log("boo");
}
}
var bar = new foo().boo();
var baz = new foo().boo();
如果我将self
设置为等于this
,它会通过,为什么会这样?
答案 0 :(得分:3)
问题在以下行
y
上面的行缺少变量声明。因此foo = this;
将引用作为构造函数的全局变量foo
。当您首次调用该函数时,该行将执行,并且foo
会更改为foo
( this
)
在第二种情况下,代码还将创建一个全局变量foo
,该变量将等于self
。但是在那种情况下,因为名称不同,它不会更改构造函数。
解决方案是使用this
(或foo
)使let
成为局部变量。
const/var
答案 1 :(得分:0)
尽管您已经有了答案,但是您可能未明确设置this
。如果您在console.log
函数内foo
,它将记录一个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();