“这个。”在Javascript混乱中

时间:2014-04-05 01:27:26

标签: javascript jquery this

在这种情况下,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)时,警报显示为未定义。我已经尝试了所有四种情况:

  1. $.get函数内,写下verbs = data.split("\n")及其外部,写alert(verbs)
  2. $.get函数内,写下verbs = data.split("\n")及其外部,写alert(this.verbs)
  3. $.get函数内,写下this.verbs = data.split("\n")及其外部,写alert(verbs)
  4. $.get函数内,写this.verbs = data.split("\n")及其外部,写alert(this.verbs)
  5. 所有这四种情况都让我在警报中未定义。发生了什么事?

4 个答案:

答案 0 :(得分:1)

$.get()是异步的:您的代码在$.get看到结果之前不会等到那里。这个结果将在稍后回来 - 这就是为什么你给它一个回调,因为它不像常规函数调用,代码等待直到结果直接传递给调用者。为了扩展一个比喻,它有点像你留下的信息。将联系服务器,浏览器(通过jQuery,yada)将在收到服务器响应时在不久的将来调用您的回调。与此同时,在收到回复之前,您的代码已经开始并调用alert

所以,到thisthis.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");

我希望这会有所帮助。