Underscore.js为什么这个未定义

时间:2014-02-06 19:39:41

标签: javascript underscore.js

我正在学习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.fooobj.a()和未定义?

2 个答案:

答案 0 :(得分:2)

this.foo未定义,因为var foo在本地范围内定义变量,而不是对象的属性。

obj.a()未定义,因为您未在声明的函数中返回任何内容。

答案 1 :(得分:2)

如果您想要排队this.foofoo,可能需要使用以下内容:

  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] 

原始代码存在一些问题:

  1. _.extend是调用所需函数的方法,_是命名空间,extend是方法名称。
  2. _.extend的输出是副本,而不是就地替换,因此您应将输出保存为obj或其他变量名称。
  3. foothis.foo不同。 this.foo是对象(无名对象)的属性,其方法为a,而var fooa方法内的局部变量。
  4. 如果以上内容已修复(对于单词的某些版本已修复),则obj.a()具有未定义的输出,因为没有返回值。
  5. obj你定义它的方式是一个函数,但也基本上是一个类定义。
  6. 调整:  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,请注意输出到控制台。