&引用;这一点;在Javascript混乱中
在这种情况下,&引用;这一点;在Javascript混乱中,javascript,jquery,this,Javascript,Jquery,This,在这种情况下,$.get函数中的this指的是什么 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");
$.get
函数中的this
指的是什么
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();
当我在$.get
函数之外编写alert(verbs)
时,甚至在alert(this.verbs)
之外,警报显示为未定义。我已审理了所有四个案件:
$.get
函数内部,写入verbs=data.split(“\n”)
并在其外部,写入警报(verbs)
$.get
函数内部,写入verbs=data.split(“\n”)
并在其外部,写入警报(this.verbs)
$.get
函数内部,写入this.verbs=data.split(“\n”)
并在其外部,写入警报(verbs)
$.get
函数中,写入this.verbs=data.split(“\n”)
并将其输出,写入alert(this.verbs)
这四种情况都给了我一个未定义的警告。发生了什么事?
函数中的此
引用了该函数的上下文,因此您只能在此函数中或。。。在你的例子中,就在函数内部
window.importdata = function() {
$.get('sdfs', function() { console.log(typeof this) }
)};
动词
到处都未定义,因为您没有为其分配任何内容,此。$之外的动词
未定义。get
由于上述原因(换句话说,它超出了其范围)
因此,也就是说,只有在$.get
中调用警报(this.verbs)
,您才会得到一些结果。get()是异步的:您的代码不会在那里等待,直到$。get
看到结果。这个结果将在稍后返回——这就是为什么要给它一个回调,因为它不像常规函数调用那样,代码会等待结果直接传递给调用方。用一个比喻来说,这有点像你在留言。将联系服务器,并且浏览器(通过jQuery,yada)将在不久的将来收到服务器的响应时调用您的回调。同时,在收到响应之前,您的代码将已经执行并调用了警报
那么,继续看这个
<代码>此。动词
与普通的动词
不同。普通的动词将引用您在var语句中声明的动词。他们彼此无关。他们有相同的名字,但他们是住在不同街道上的不同的人。碰巧,当您将分配给this.verbs
时,您正在将其创建为的成员。那对你没有任何帮助。在回调之外,此
将引用全局窗口
对象,除非您正在编写自己的类,我对此表示怀疑
如果您想将动词
存储在其他代码可以访问到的地方,那么顶部的普通动词
就是要使用的
jQuery使用这个的方式对于新程序员来说非常不清楚,而且。理智的人不同意
案例1是唯一一个最有希望工作的案例,因为它是唯一一个您分配给外部作用域谓词
,然后将相同变量传递给警报
的案例。由于上面给出的时间原因,它还是失败了
在调用this.importData()
之前,请尝试将占位符值--“初始谓词值”
--分配给谓词。我希望您将在警报中看到该初始值
尝试在$内调用警报
。获取
回调。看看你能得到什么。我很有信心你会看到你从服务器上得到的任何东西
使用动词
的代码应该从该回调调用,此时您只需将其分配给动词
。以下是我的偏好。你可以把这一切都塞进回叫里,很多人都是这样做的
this.importData = function() {
$.get("generator/parts_of_speech/verbs.txt", function(data) {
doStuffWithVerbs(data.split("\n"));
});
};
function doStuffWithVerbs(verbs) {
// Whatever you're doing with verbs goes here
}
这个“这个”指的是什么**
它指的是jQuery设置对象
从上下文选项
此对象将成为所有Ajax相关回调的上下文。通过
默认情况下,上下文是表示ajax设置的对象
在调用中使用($.ajaxSettings与传递给的设置合并
$.ajax)
从代码的外观来看,您希望将动词
分配给方法importData
所属的对象(假设您知道ajax请求和请求的异步性质)
可以使用将自定义上下文传递给回调方法/
另一种方法是使用闭包变量,如
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???**
});
};
在您的例子中,“this”指的是全局窗口对象。如果你去控制台把它放进去
this
它将返回窗口对象
但是,在$.get中,它的作用域是当前函数
window.importdata = function() {
$.get('sdfs', function() { console.log(typeof this) }
)};
记录“对象”,但它是xHr对象
您声明的所有变量都在全局范围内。(视窗范围)
但您正在尝试从其他作用域中访问this.verbs,而该函数中不存在this.verbs
window.importdata = function() {
$.get('sdfs', function() { console.log(typeof this) }
)};
在控制台中点击此按钮将返回未定义。这意味着它已声明,但没有为其指定值
this.verbs
但是在你的函数中,我相信你会得到一个错误。因为您在全局范围内声明了这些变量,所以它们在您的函数中是可用的
我希望这有帮助 在你的情况下,你为什么还要尝试访问此
?你将警报放在哪里?你知道,$.get()
将是异步的,对吗?因此,您需要在get回调内部(或在从那里调用的其他函数中)执行任何处理,或者使用.done()
..@nnnn-huh。。。我没想到那部分。我确实把它放在了后面。importData()。我要做的就是把从文本文件中检索到的数据放进去
verbs = data.split("\n");