Javascript Ajax赋值变量赋值后不可访问

Javascript Ajax赋值变量赋值后不可访问,javascript,jquery,ajax,Javascript,Jquery,Ajax,所以,我有一个从SQL数据库获取数据的脚本,我正在尝试为它构建一个JS包装器。我将使用以下函数调用该脚本,并在数据库准备就绪后立即使用数据库中的信息 var User = function() { this.email = null; //Async call to get user values this.current(function(response) { this.email = response.email; //The v

所以,我有一个从SQL数据库获取数据的脚本,我正在尝试为它构建一个JS包装器。我将使用以下函数调用该脚本,并在数据库准备就绪后立即使用数据库中的信息

var User = function() {
    this.email = null;

    //Async call to get user values
    this.current(function(response) {
        this.email = response.email;

        //The value is assigned/usable at this point
    });
};

User.prototype.current = function(callback) {
    $.post("php/db_functions.php", {object: "CurrentUser"}).done(function(result) {
        callback(JSON.parse(result)[0]);
    });
};.
一切似乎都很正常,但如果在创建对象后尝试从对象访问该值,它将返回未定义的值,如下所示:

var me = new User();

//And then, way after the async call and when me.email should be defined
me.email //Returns undefined

为什么我可以在回调中使用它,但不能在回调之后使用?

这是一个计时错误,因为直到异步调用返回时才分配变量。您无法立即访问电子邮件。

这是一个计时错误,因为在异步调用返回之前不会分配变量。您无法立即访问电子邮件。

这是一个计时错误,因为在异步调用返回之前不会分配变量。您无法立即访问电子邮件。

这是一个计时错误,因为在异步调用返回之前不会分配变量。您无法立即访问电子邮件。

在函数中,上下文变量
this
在严格模式下指向全局
窗口
对象或
未定义
,除非调用方另有规定。因此,您需要在局部变量中捕获
this
的值:

//Async call to get user values
var that = this;
this.current(function(response) {
    that.email = response.email;
});
或使用或方法在所需上下文中调用函数:


另外,正如其他人所提到的,不能保证AJAX请求在
用户
构造函数返回时完成。

在函数中,上下文变量
this
在严格模式下指向全局
窗口
对象或
未定义
,除非调用方另有规定。因此,您需要在局部变量中捕获
this
的值:

//Async call to get user values
var that = this;
this.current(function(response) {
    that.email = response.email;
});
或使用或方法在所需上下文中调用函数:


另外,正如其他人所提到的,不能保证AJAX请求在
用户
构造函数返回时完成。

在函数中,上下文变量
this
在严格模式下指向全局
窗口
对象或
未定义
,除非调用方另有规定。因此,您需要在局部变量中捕获
this
的值:

//Async call to get user values
var that = this;
this.current(function(response) {
    that.email = response.email;
});
或使用或方法在所需上下文中调用函数:


另外,正如其他人所提到的,不能保证AJAX请求在
用户
构造函数返回时完成。

在函数中,上下文变量
this
在严格模式下指向全局
窗口
对象或
未定义
,除非调用方另有规定。因此,您需要在局部变量中捕获
this
的值:

//Async call to get user values
var that = this;
this.current(function(response) {
    that.email = response.email;
});
或使用或方法在所需上下文中调用函数:



另外,正如其他人所提到的,不能保证AJAX请求在
用户
构造函数返回时完成。

因为
$.post()
是异步的。知道它是异步的本身没有帮助,因为我的问题是上下文而不是时间。好的,抱歉。这是一个非常常见的误解,不清楚在哪里调用了
new User()
。因为
$.post()
是异步的。知道它是异步的本身没有帮助,因为我的问题是上下文而不是时间。好的,抱歉。这是一个非常常见的误解,不清楚在哪里调用了
new User()
。因为
$.post()
是异步的。知道它是异步的本身没有帮助,因为我的问题是上下文而不是时间。好的,抱歉。这是一个非常常见的误解,不清楚在哪里调用了
new User()
。因为
$.post()
是异步的。知道它是异步的本身没有帮助,因为我的问题是上下文而不是时间。好的,抱歉。这是一个非常常见的误解,不清楚在哪里调用了
new User()
。这很好。其他回答者注意:我可能不清楚,但这不是时间问题。我没有试图在赋值后立即访问该值。真正的问题就在这里。
this
的行为往往是一个巨大的痛苦。在ECMAScript 6中,添加了lambda表达式语法,它捕获了
this
,因此不再需要我描述的内容:
this.current((response)=>this.email=response.email)遗憾的是,在发表此评论时,只有Firefox支持这些。如果说函数的
this
默认指向全局对象,那就有误导性了。这完全取决于函数的调用方式。这就是为什么我澄清了它只指向
窗口
对象,除非使用方法、方法或点表示法另外指定。那么括号表示法、
.bind
new
和strict模式呢?这就是我的观点,有太多的“例外”使得全局变量引用成为默认值是很奇怪的。简单地说,值取决于函数的调用方式,在这种特定情况下,它指向
窗口
,因为函数的调用传统上类似于
x()
。这很好。其他回答者注意:我可能不清楚,但这不是时间问题。我没有试图在赋值后立即访问该值。真正的问题就在这里。
this
的行为往往是一个巨大的痛苦。在ECMAScript 6中,添加了lambda表达式语法,它捕获了
this
,因此不再需要我描述的内容:
this.current((response)=>this.email=response.email)