&引用;这一点;在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");