在这种情况下,this
函数中的$.get
是指什么?
var articles, verbs, nouns, prepositions, adjectives, words;
articles = ["the", "a"];
this.importData = function() {
$.get("generator/parts_of_speech/verbs.txt", function(data) {
this.verbs = data.split("\n");
**//what does this "this" refer to???**
});
};
this.importData();
当我在alert(verbs)
函数之外写$.get
,甚至alert(this.verbs)
时,警报显示为未定义。我已经尝试了所有四种情况:
$.get
函数内,写下verbs = data.split("\n")
及其外部,写alert(verbs)
$.get
函数内,写下verbs = data.split("\n")
及其外部,写alert(this.verbs)
$.get
函数内,写下this.verbs = data.split("\n")
及其外部,写alert(verbs)
$.get
函数内,写this.verbs = data.split("\n")
及其外部,写alert(this.verbs)
所有这四种情况都让我在警报中未定义。发生了什么事?
答案 0 :(得分:1)
$.get()
是异步的:您的代码在$.get
看到结果之前不会等到那里。这个结果将在稍后回来 - 这就是为什么你给它一个回调,因为它不像常规函数调用,代码等待直到结果直接传递给调用者。为了扩展一个比喻,它有点像你留下的信息。将联系服务器,浏览器(通过jQuery,yada)将在收到服务器响应时在不久的将来调用您的回调。与此同时,在收到回复之前,您的代码已经开始并调用alert
。
所以,到this
。 this.verbs
与普通verbs
不同。普通verbs
将引用您在var语句中声明的那个。他们彼此无关。他们有相同的名字,但他们是生活在不同街道上的不同的人。碰巧的是,当您分配到this.verbs
时,您将其创建为a settings object internal to $.get
的成员。这对你没有任何帮助。在回调之外,this
将引用全局window
对象,除非您正在编写自己的类,我怀疑。
如果您想将verbs
存储在其他代码可以访问的位置,则顶部的普通verbs
是要使用的位置。
jQuery使用this
的方式对新程序员和there's a solid argument that it's a design flaw非常不清楚。合理的人不同意。
案例1是唯一一个有工作希望的案例,因为它是您分配给外部作用域verbs
然后将同一个变量传递给{的唯一一个案例。 {1}}。无论如何,由于上面给出的时间原因,它失败了。
在致电alert
之前,尝试将占位符值 - "initial verbs value"
- 分配给verbs
。我希望您会在this.importData()
中看到初始值。
在alert
回调中尝试alert
来电。看看你得到了什么。我很自信你会看到你从服务器获得的任何东西。
应该从该回调中调用使用$.get
的代码,现在您只需将其分配给verbs
。以下是我的偏好。你可以在回调中填充所有内容,很多人都这样做。
verbs
答案 1 :(得分:1)
这是什么"这"参考??? **
它指的是jQuery设置对象。
来自$.ajax() - 上下文选项
此对象将成为所有与Ajax相关的回调的上下文。通过 默认情况下,上下文是表示ajax设置的对象 在调用中使用($ .ajaxSettings与传递给的设置合并 $就)。
从您的代码看起来的方式来看,您希望将verbs
分配给方法importData
所属的对象(假设您了解ajax请求的异步性质并how a value set by an async method has to be used )。
您可以使用Function.bind() / $.proxy()
将自定义上下文传递给回调方法this.importData = function () {
$.get("generator/parts_of_speech/verbs.txt", $.proxy(function (data) {
this.verbs = data.split("\n");
//here now `this` refers to the same context on which `importData` was called
}, this));
};
另一个选择是使用像
这样的闭包变量this.importData = function() {
var self = this;
$.get("generator/parts_of_speech/verbs.txt", function(data) {
self.verbs = data.split("\n");
**//what does this "this" refer to???**
});
};
答案 2 :(得分:0)
this
指向该函数的上下文,因此您只能在此函数内部访问它,或者在您的情况下仅在函数内部访问它。
verbs
在任何地方都未定义,因为您没有为其指定任何内容,this.verbs
之外的$.get
由于上述原因而未定义(换句话说,它不属于它的范围)......
换句话说,只有当您在alert(this.verbs)
内拨打$.get
时,您才能获得一些结果
答案 3 :(得分:0)
在您的情况下,“this”指的是全局窗口对象。如果你去控制台并投入使用。
this
它将返回窗口对象。
但是,在$ .get中,它的作用域是当前函数。
window.importdata = function() {
$.get('sdfs', function() { console.log(typeof this) }
)};
记录“对象”但是它的xHr对象。
您声明的所有变量都在全局范围内。 (窗口范围)
var articles, verbs, nouns, prepositions, adjectives, words;
但是你试图从不同的范围内访问this.verbs,并且该函数中不存在this.verbs。
在控制台中点击此按钮将返回undefined。这意味着它已被声明,但没有赋值给它。
this.verbs
但是在你的功能中你会发现我相信的错误。由于您在全局范围内声明了这些变量,因此它们在您的函数中可用,只是松开了“this”。
verbs = data.split("\n");
我希望这会有所帮助。