Javascript 为什么在这段Typescript/jscript代码中作用域出错
下面的代码位于“视图”中,并且与“this”存在范围问题 打字稿:Javascript 为什么在这段Typescript/jscript代码中作用域出错,javascript,typescript,Javascript,Typescript,下面的代码位于“视图”中,并且与“this”存在范围问题 打字稿: getInvitations() { var invitationsUri = "/Api/Invitations/"; $.ajax({ url: invitationsUri , type: 'GET', dataType: 'json', contentType: 'application/js
getInvitations() {
var invitationsUri = "/Api/Invitations/";
$.ajax({
url: invitationsUri ,
type: 'GET',
dataType: 'json',
contentType: 'application/json'
})
.done((result) => {
$.each(result, (index, item) => {
var invitation = new Invitation();
invitation.InvitationId(item.InvitationId);
invitation.Invited(true);
invitation.Email(item.Email);
this.Business.Invitations.push(invitation);
});
})
.fail((x, y, z) => {
alert(x + '\n' + y + '\n' + z + ' - failed to get invitations');
});
}
getUsers() {
var usersUri = "/Api/Users/";
$.ajax({
url: usersUri,
type: 'GET',
dataType: 'json',
contentType: 'application/json'
})
.done((result) => {
$.each(result, (index, item) => {
var user = new User();
user.Id(item.Id);
user.UserName(item.UserName);
user.Email(item.Email);
this.Business.Users.push(user);
});
})
.fail((x, y, z) => {
alert(x + '\n' + y + '\n' + z + ' - failed to get users');
});
}
第一种方法效果很好,第二种方法认为“this”指的是“item”,因此它不承认“Business”是一种财产,因此无法实现目标
你知道这里会发生什么吗
编辑:
以下是生成的代码(jscript)
在jQuery
.each()
回调中,此
始终由jQuery设置,因此它不会像此
在更高级别范围中那样。如果需要从更高级别的作用域访问this
的值,通常的解决方法是将其保存到该更高级别作用域的局部变量中,然后可以从.each()
回调函数中访问该局部变量
从答案中包含的代码片段中,不清楚您要访问的
值是什么。您可能还需要知道,调用常规函数(如调用getinvestments()
)会将指向全局对象或严格模式下的指针更改为未定义的此值由javascript解释器根据函数调用的方式在每次函数调用时设置。您在每次调用中获得了正确的lambda,即$。每个(结果,(索引,项)=>{
您应该对函数定义执行相同的操作,以确保此
的作用域始终正确,即getinvestments=()=>{
和getUsers=()=>{
示例代码….这是带有敲除的Typescript,无论出于什么原因,GetInvestments都可以正常工作。@Oakcool-那么,$是从jQuery还是敲除中使用的each()
呢?@Oakcool-好的,那么我的解释是正确的。$.each()
setthis
在回调中。它不会像在更高范围内那样。您需要使用我建议的解决方法。从技术上讲,如果您查看生成的代码,就会看到它。BusinessView.prototype.getUsers=function(){var\u this=this;
BusinessView.prototype.getInvitations = function () {
var _this = this;
var invitationsUri = "/Api/Invitations/";
$.ajax({
url: invitationsUri,
type: 'GET',
dataType: 'json',
contentType: 'application/json'
}).done(function (result) {
$.each(result, function (index, item) {
var invitation = new Invitation();
invitation.InvitationId(item.InvitationId);
invitation.Invited(true);
invitation.Email(item.Email);
_this.Business.Invitations.push(invitation);
});
}).fail(function (x, y, z) {
alert(x + '\n' + y + '\n' + z + ' - failed to get invitations');
});
};
BusinessView.prototype.getUsers = function () {
var _this = this;
var usersUri = "/Api/Users/";
$.ajax({
url: usersUri,
type: 'GET',
dataType: 'json',
contentType: 'application/json'
}).done(function (result) {
$.each(result, function (index, item) {
var user = new User();
user.Id(item.Id);
user.UserName(item.UserName);
user.Email(item.Email);
_this.Business.Users.push(user);
});
}).fail(function (x, y, z) {
alert(x + '\n' + y + '\n' + z + ' - failed to get users');
});
};