gpt4 book ai didi

Javascript - "this"为空

转载 作者:行者123 更新时间:2023-11-30 18:29:22 24 4
gpt4 key购买 nike

我正在尝试使用 Node.js 为我的 Web 应用程序编写服务器端。提取以下代码以模拟情况。问题是应用程序在尝试访问 actionExecuted“方法”中的 this.actions.length 时崩溃。属性 this.actions 在那里未定义(范围内的 this == {}),即使它是在“构造函数”(请求函数本身)中定义的。如何使其他“方法”也可以访问 actions 属性?

var occ = {
exampleAction: function(args, cl, cb)
{
// ...

cb('exampleAction', ['some', 'results']);
},

respond: function()
{
console.log('Successfully handled actions.');
}
};

Request = function(cl, acts)
{
this.client = cl;
this.actions = [];
this.responses = [];

// distribute actions
for (var i in acts)
{
if (acts[i][1].error == undefined)
{
this.actions.push(acts[i]);
occ[acts[i][0]](acts[i][1], this.client, this.actionExecuted);
}
else
// such an action already containing error is already handled,
// so let's pass it directly to the responses
this.responses.push(acts[i]);
}
}

Request.prototype.checkExecutionStatus = function()
{
// if all actions are handled, send data to the client
if (this.actions == [])
occ.respond(client, data, stat, this);
};

Request.prototype.actionExecuted = function(action, results)
{
// remove action from this.actions
for (var i = 0; i < this.actions.length; ++i)
if (this.actions[i][0] == action)
this.actions.splice(i, 1);

// and move it to responses
this.responses.push([action, results]);
this.checkExecutionStatus();
};

occ.Request = Request;

new occ.Request({}, [['exampleAction', []]]);

最佳答案

问题在于您定义回调的方式。它稍后被调用,因此它失去了上下文。您必须创建闭包或正确绑定(bind) this。创建闭包:

var self = this;
occ[acts[i][0]](acts[i][1], this.client, function() { self.actionExecuted(); });

绑定(bind)到this:

occ[acts[i][0]](acts[i][1], this.client, this.actionExecuted.bind(this));

两者都可以。

关于Javascript - "this"为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com