此代码不会打印任何内容

时间:2016-01-25 22:27:35

标签: javascript oop object

你能解释一下为什么这段代码显示错误并且没有打印任何内容吗?

var myObject = {
  test: "bar",
  myfunc: function() {
    var self = this;
    console.log("outer myfunc: this.test = " + this.test);
    console.log("outer myfunc: self.test = " + self.test);
    (function () { 
      console.log("inner myfunc: this.test = " + this.test);
      console.log("outer myfunc: self.test = " + self.test);
    } ());
  }
};

它成功编译没有错误,但在运行后它只打印未定义的字符串

3 个答案:

答案 0 :(得分:0)

您正在创建可以在将来调用的函数。但你实际上并没有这样称呼它。你需要打电话。

ReplaceSegue

tutorial中的“调用JavaScript函数”部分可能会有所帮助。

答案 1 :(得分:0)

在第3行,您已在对象myFunc上定义了方法myObject。当您调用console.log

时,这只会myObject.myfunc();

在第7行,您将创建一个IIFE。这定义了一个函数并立即调用它。当您调用myObject.myfunc();

时,这也只会是console.log

myFunc全局不存在。这是一个附加到myObject的方法。

console.log("outer myfunc: this.test = " + this.test);

console.log("outer myfunc: self.test = " + self.test);

此处第5和第6行selfthis将始终引用同一个对象。如果您调用函数myObject.myfunc();,则this.testself.test将评估为"bar"

现在,如果您执行setTimeout(myObject.myfunc, 0);,则selfthis都会引用window对象,因此test将被取消定义window.test }目前尚未定义)。这是因为this对象是在运行时在Javascript中动态确定的。将myObject.myfunc注册为回调将评估指向已定义函数的指针。在此上下文中调用myfunc将是一个自由函数调用 - 没有myObject作为this上下文,它将默认为window对象。

console.log("inner myfunc: this.test = " + this.test);

console.log("outer myfunc: self.test = " + self.test);

在第8行和第9行this将始终引用window对象并打印undefined,除非您将test指定给窗口。 Self将遵循上述模式。

答案 2 :(得分:-1)

除非您使用(function($) { $.fn.scroller = function() { var self = this, scrollBarDrag = false, docHeight = $(document).height(); var scrollContainer = document.createElement('div'), scrollBar = document.createElement('div'); scrollContainer.className = 'scroll-container'; scrollBar.className = 'scroll-bar'; scrollContainer.appendChild(scrollBar); self[0].appendChild(scrollContainer); self.on('scroll', function() { var top = $(this).scrollTop(); setScrollBarTop(top); }); function setScrollBarTop (top) { scrollBar.style.top = top + 'px'; } }; })(jQuery); ,否则您的代码不会打印任何内容,这可以通过访问myfunc中的myFunc来完成,就像访问对象属性一样。因此,除了现有代码之外,还可以在以下任意位置写入:

myObject

哪个应显示您期望的控制台输出。如果您发现任何其他错误,请通过添加以下评论告诉我们。