[英]Why the scope goes wrong in this Typescript/jscript piece of code
下面的代码在“视图”内部,并且存在“ this”的范围问题
打字稿:
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)
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');
});
};
里面一个jQuery .each()
回调, this
总是由jQuery的设置,所以它不会是什么this
是在一个较高的水平范围。 如果您需要访问的价值this
从更高的层次范围,那么通常的解决办法是将其保存到一个局部变量在这个更高的水平范围,那么你就可以访问来自内部的局部变量.each()
回调功能。
从代码段包括你在你的答案,但目前尚不清楚this
,你要能够访问值。 您可能还需要知道,调用常规函数(如调用getInvitations()
会将this
指针更改为指向全局对象或在严格模式下指向undefined
。 this
是由javascript解释器根据每个函数调用的方式在每个函数调用上设置的。
您在每个调用中都得到正确的lambda值,即$.each(result, (index, item) => {
您应该对函数定义执行相同的操作,以确保在整个过程中, this
的作用域都是正确的,即getInvitations = () => {
和getUsers = () => {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.