你能解释一下为什么这段代码显示错误并且没有打印任何内容吗?
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);
} ());
}
};
它成功编译没有错误,但在运行后它只打印未定义的字符串
答案 0 :(得分:0)
答案 1 :(得分:0)
在第3行,您已在对象myFunc
上定义了方法myObject
。当您调用console.log
myObject.myfunc();
在第7行,您将创建一个IIFE。这定义了一个函数并立即调用它。当您调用myObject.myfunc();
myFunc全局不存在。这是一个附加到myObject的方法。
console.log("outer myfunc: this.test = " + this.test);
console.log("outer myfunc: self.test = " + self.test);
此处第5和第6行self
和this
将始终引用同一个对象。如果您调用函数myObject.myfunc();
,则this.test
和self.test
将评估为"bar"
。
现在,如果您执行setTimeout(myObject.myfunc, 0);
,则self
和this
都会引用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
哪个应显示您期望的控制台输出。如果您发现任何其他错误,请通过添加以下评论告诉我们。