0

我对 javascript 有点陌生,我在实施以下内容时遇到了困难(现在已经有 2 天了):

考虑我有一个 Object(),'engine',我希望它根据帖子的内容做出不同的响应。即用户有一个动作,引擎解释动作,向服务器发送请求,服务器响应,“引擎”相应地采取行动。

作为所需行为的一个最小示例,我展示了一个“引擎”,它假设正在接收鼠标点击的位置(receiveClickEvent),通过“帖子”(requestByAsyncPost)发送它,并根据其内容做出响应(respondToRequest):

做post的一个小功能

function requestByAsyncPost(content, funct)
{
/* some initialization missing here to not confuse the reader */
xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            funct(xmlhttp.response);
        }
    }
xmlhttp.open("POST","foobar.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(content);
}

var engine = new Object()
engine.respondToRequest = function(content) {/*implementation*/ }

当鼠标点击发生时我想激活的一小段代码(现在不管它是如何触发的)

engine.receiveClickEvent = function(position)
{
    var funct = function(content)
    {
         this.respondToRequest(content); //<<<---- I want to refer engine's 'this'
    }
    requestByAsyncPost('request=click&position=['+position[0]+','+position[1]+')', funct);
}

这不是我想要的方式,因为“this”在函数函数内部。我怎样才能实现这种行为?

4

5 回答 5

2

this你必须通过这种或其他方式记住外部。像:

engine.receiveClickEvent = function(position)
{
    var self = this;
    var funct = function(content)
    {
         self.respondToRequest(content); //<<<---- 'self' refers engine's 'this'
    }; // <<<--- btw, missed semicolon
    requestByAsyncPost('request=click&position=['+position[0]+','+position[1]+')', funct);
}; // <<<--- btw, here, too :-)
于 2012-11-04T15:03:41.147 回答
1

在大量使用匿名 AJAX 回调函数时,我经常遇到同样的问题。

这就是我“解决”此类问题的方式:

var engine = function (args) {
    // store a reference to "this" inside a variable for reuse in another scope
    var me = this;
    var fetchSomething = function (args) {
        var req = $.ajax({
            method: 'POST',
            url: url,
            success: function(data) {
                // use "me" instead of "this", because "this" is scope dependant
                me.doSomething(data);
            }
        });
    }
    var doSomething = function (data) {
        // some logic here.
    }  
} 
foo = new engine({arg: 'foo', arg2: 'bar'});
foo.fetchSomething(url);
于 2012-11-04T15:04:58.527 回答
0

您始终可以将当前的 this 保存在一个变量中,然后在任何您想要的地方使用它:

var that = this;
于 2012-11-04T15:02:44.730 回答
0

试试这个:

engine.receiveClickEvent = function(position)
{

    var me = this;
    var funct = function(content)
    {
         me.respondToRequest(content); //<<<---- I want to refer engine's 'this'
    }
    requestByAsyncPost('request=click&position=['+position[0]+','+position[1]+')', funct);
}
于 2012-11-04T15:03:18.633 回答
0

我不确定我是否完全理解这个问题,但我认为您可能正在寻找的是在引擎对象中定义一个 var this .. 然后在您的函数中使用该变量而不是 this ..

IE :

var engine = function(){
var self = this;

receiveClickEvent = function(position)
{
    var funct = function(content)
    {
         **self**.respondToRequest(content); //<<<---- I want to refer engine's 'this'
    }
    requestByAsyncPost('request=click&position=['+position[0]+','+position[1]+')',   funct);
}

}
于 2012-11-04T15:05:20.397 回答