我正在学习Underscore.js,请参阅此代码段
var obj = function() {
var foo = 1;
}
_(obj).extend({
a: function(){
var foo = 2;
console.log("this.foo=" + this.foo + "\nthis=" + this + "\nfoo=" + foo + "\n\n");
}
});
console.log("obj.a="+obj.a()+"\nobj="+obj);
控制台输出
this.foo=undefined
this=function () {
var foo = 1;
}
foo=2
obj.a()=undefined
obj=function () {
var foo = 1;
}
为什么this.foo
和obj.a()
和未定义?
答案 0 :(得分:2)
this.foo
未定义,因为var foo
在本地范围内定义变量,而不是对象的属性。
obj.a()
未定义,因为您未在声明的函数中返回任何内容。
答案 1 :(得分:2)
如果您想要排队this.foo
和foo
,可能需要使用以下内容:
var foo = 2;
var Obj = function() {
var foo = 1;
}
var obj = _.extend(new Obj(), {
foo : foo,
a: function(){
console.log("this.foo=" + this.foo + "\nthis=" + this + "\nfoo=" + foo + "\n\n");
return this.foo;
}
});
console.log("obj.a="+obj.a()+"\nobj="+obj);
这给出了输出:
this.foo=2
this=[object Object]
foo=2
obj.a=2
obj=[object Object]
原始代码存在一些问题:
_.extend
是调用所需函数的方法,_
是命名空间,extend
是方法名称。_.extend
的输出是副本,而不是就地替换,因此您应将输出保存为obj
或其他变量名称。foo
和this.foo
不同。 this.foo
是对象(无名对象)的属性,其方法为a
,而var foo
是a
方法内的局部变量。obj.a()
具有未定义的输出,因为没有返回值。obj
你定义它的方式是一个函数,但也基本上是一个类定义。调整:
1.我将obj
转换为Obj
以表示其作为班级的状态
2.我将var foo
添加到具有Obj
的同一名称空间。
3.在_.extend
的调用中,我实例化Obj
。
4.我将var foo
(暂时)与this.foo
同步,使其成为您使用Obj
实例扩展的无名对象的属性。
5.将_.extend
的输出保存为obj
6.我给方法a
一个返回值(我选择this.foo
)。
这是working fiddle,请注意输出到控制台。