Javascript 为什么在这段Typescript/jscript代码中作用域出错

Javascript 为什么在这段Typescript/jscript代码中作用域出错,javascript,typescript,Javascript,Typescript,下面的代码位于“视图”中,并且与“this”存在范围问题 打字稿: getInvitations() { var invitationsUri = "/Api/Invitations/"; $.ajax({ url: invitationsUri , type: 'GET', dataType: 'json', contentType: 'application/js

下面的代码位于“视图”中,并且与“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)


在jQuery
.each()
回调中,
始终由jQuery设置,因此它不会像
在更高级别范围中那样。如果需要从更高级别的作用域访问
this
的值,通常的解决方法是将其保存到该更高级别作用域的局部变量中,然后可以从
.each()
回调函数中访问该局部变量


从答案中包含的代码片段中,不清楚您要访问的
值是什么。您可能还需要知道,调用常规函数(如调用
getinvestments()
)会将指向全局对象或严格模式下的
指针更改为
未定义的
此值由javascript解释器根据函数调用的方式在每次函数调用时设置。

您在每次调用中获得了正确的lambda,即
$。每个(结果,(索引,项)=>{
您应该对函数定义执行相同的操作,以确保
的作用域始终正确,即
getinvestments=()=>{
getUsers=()=>{

示例代码….这是带有敲除的Typescript,无论出于什么原因,GetInvestments都可以正常工作。@Oakcool-那么,
$是从jQuery还是敲除中使用的each()
呢?@Oakcool-好的,那么我的解释是正确的。
$.each()
set
this
在回调中。它不会像在更高范围内那样。您需要使用我建议的解决方法。从技术上讲,如果您查看生成的代码,就会看到它。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');
        });
    };