- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在以下代码的多个实例中,我很难弄清楚“this”指的是什么:
jQuery(function ($) {
var coreChat = {
fetch: function (fn) {
$.ajax({
url: "https://api.parse.com/1/classes/chats",
data: {
order: 'createdAt',
limit: 10
},
type: "GET"
})
.done(function(data) {
var messages = [];
for (var i = 0, len = data.results.length; i < len; i++) {
messages.push(data.results[i].text);
}
return fn(messages);
});
},
send: function (message) {
var data = JSON.stringify({text: message});
$.ajax({
url: "https://api.parse.com/1/classes/chats",
data: data,
type: "POST"
});
},
display: function (messages) {
// http://jsperf.com/update-only-text-vs-remove-dom
var messageNode = $(".messages").find("li");
messageNode.each(function (i) {
var $this = $(this);
if ($this.text() !== messages[i]) {
$this.text(messages[i]);
}
});
}
};
var myChat = {
init: function () {
**this**.fetchInitialData();
**this**.bindSendEvent();
**this**.refresh();
},
fetchInitialData: function () {
var messagesWrapper = $(".messages");
for (var i = 0; i < 10; i++) {
$("<li></li>").appendTo(messagesWrapper);
}
myChat.updateMessages();
},
bindSendEvent: function () {
$(".send").on("click", function (e) {
var input = $(".draft");
myChat.send(Chat.username + ": " + input.val());
input.val("");
e.preventDefault();
});
},
refresh: function () {
setInterval(function () {
myChat.updateMessages();
}, 3000);
},
updateMessages: function () {
this.fetch(function (messages) {
myChat.display(messages);
});
}
};
$.extend(myChat, coreChat);
myChat.init();
});
更具体地说,在代码的下半部分 - 在 myChat 对象中,有一个“init”属性,它作为一个值包含一个函数...
var myChat = {
init: function () {
this.fetchInitialData();
this.bindSendEvent();
this.refresh();
},
这里的“这个”指的是什么? coreChat 在代码的第二行到最后一行上扩展为 myChat 这一事实是否对确定“this”所指的内容产生影响?
$.extend(myChat, coreChat);
此外,myChat 对象的 updateMessages 属性中还有另一个“this”...
updateMessages: function () {
this.fetch(function (messages) {
myChat.display(messages);
});
}
^ 在这个例子中,this 指的是什么? coreChat 的 fetch 函数正在“this”上执行,但是,“this”是什么?
作为一个快速切题的问题 - 在 updateMessages 函数中,它调用“fetch”函数。“fetch”与回调函数异步(“fetch”最初是在 coreChat 对象中找到的)。但是在 updateMessages 中,作为参数传入以获取的函数是什么? fetch 是否应该执行它原来的回调函数,然后这个参数作为回调的参数?我肯定很困惑。
^ 我知道这是两个单独的问题 - 如果这提出了问题,我会删除它,并将其发布在一个新的单独问题中,但我只是想,因为有人可能已经完成了整个代码,也许他' d/她已经有能力回答第二个问题,我不妨问...
提前致谢!
最佳答案
如果您来自 Java 等面向对象的世界,“this”是一个有点不同的概念。在 Java 等语言中,“this”指的是当前正在执行的对象,并由方法的声明方式来定义。但是,在 Javascript 中,“this”指的是函数如何被调用,并且实际上是函数的执行上下文。事实上,引用 John Resig 在“Javascript Ninja 的 secret ”中的说法,它确实应该称为调用上下文。
回答您的问题:
this
在 init
函数指的是myChat
目的。不,您使用 jQuery.extend 合并两个对象的事实与 this 的值无关。这对 jQuery 来说有点误导。
this
在updateMessages
也指myChat
对象
上面代码中需要警惕的一件事是 setInterval
refresh
中的部分。您的代码是正确的,因为它调用 myChat
上的函数显式对象,但在该函数中, this
引用全局对象(如果您在浏览器中运行,则很可能是“window
”)。
最后,回答您关于回调的第三个问题,fetch
运行异步 POST。当该 POST 完成时,done
回调被调用。从 done
返回的值回调是调用传递给 fetch
的函数的值。在您的示例中,这看起来是 undefined
因为你的函数调用 display
但是display
没有指定返回值。任何不指定返回值的函数都将返回 undefined
默认情况下。
希望有帮助。
关于javascript - 难以确定 JS/jQuery 代码中的 'this' 所指的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505739/
在带有 jQuery 的 CoffeeScript 中,以下语句有什么区别吗? jQuery ($) -> jQuery -> $ - > 最佳答案 第一个与其他两个不同,就像在纯 JavaScr
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭13 年前。 Improve th
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
这个问题可能听起来很愚蠢,但请耐心等待,因为我完全是初学者。我下载了两个 jQuery 版本,开发版本和生产版本。我想知道作为学习 jQuery 的初学者,什么更适合我。 最佳答案 如果您对 jQue
The documentation说要使用 1.6.4,但我们现在已经升级到 1.7.2。 我可以在 jQuery Mobile 中使用最新版本的 jQuery 吗? 最佳答案 您当然可以,但如果您想
我在这里看到这个不错的 jquery 插件:prettyphoto jquery lightbox有没有办法只用一个简单的jquery来实现这样的效果。 我只需要弹出和内联内容。你的回复有很大帮助。
很明显我正在尝试做一些 jQuery 不喜欢的事情。 我正在使用 javascript 上传图片。每次上传图片时,我都希望它可见,并附加一个有效的删除脚本。显示工作正常,删除则不然,因为当我用 fir
这两个哪个是正确的? jQuery('someclass').click(function() { alert("I've been clicked!"); }); 或 jQuery('somec
我正在寻找一个具有以下格式的插件 if (jQuery)(function ($) { -- plugin code -- })(jQuery); 我明白 (function ($)
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
我知道这个问题已经被问过几次了,但想知道您是否可以帮助我解决这个问题。 背景:我尝试创建一个使用 Ajax 提交的表单(jQuery 表单提交)。我已经工作得很好,然后我想在表单上得到验证。我可以使用
我正在使用无处不在的jquery validate plugin用于表单验证。它支持使用metadata plugin用于向表单元素添加验证规则。 我正在使用此功能。当验证查找这些规则时,它会对元素进
我更喜欢为我一直在开发的网络社区添加实用的视觉效果,但随着事情开始堆积,我担心加载时间。 拥有用户真的更快吗加载(希望是缓存的)副本来自 Google 存储库的 jquery? 是否使用 jQuery
这个问题已经有答案了: Slide right to left? (17 个回答) 已关闭 9 年前。 你能告诉我有没有办法在 jQuery 中左右滑动而不使用 jQuery UI 和 jQuery
我如何找出最适合某种情况的方法?任何人都可以提供一些示例来了解功能和性能方面的差异吗? 最佳答案 XMLHttpRequest 是原始浏览器对象,jQuery 将其包装成一种更有用和简化的形式以及跨浏
运行时 php bin/console oro:assets:build ,我有 11 个这样的错误: ERROR in ../node_modules/jquery-form/src/jquery.
我试图找到 jQuery.ajax() 在源代码中的定义位置。但是,使用 grep 似乎不起作用。 在哪里? 谢谢。 > grep jQuery.ajax src/* src/ajax.js:// B
$.fn.sortByDepth = function() { var ar = []; var result = $([]); $(this).each(function()
我的页面上有多个图像。为了检测损坏的图像,我使用了在 SO 上找到的这个。 $('.imgRot').one('error',function(){ $(this).attr('src','b
我在理解 $ 符号作为 jQuery 函数的别名时遇到了一些麻烦,尤其是在插件中。你能解释一下 jQuery 如何实现这种别名:它如何定义 '$' 作为 jQuery 函数的别名?这是第一个问题。 其
我是一名优秀的程序员,十分优秀!