从 onload 事件调用对象函数会导致其丢失上下文

2023-12-28

我想在加载所有必需的图像时调用一个函数。图像的数量是预先知道的,因此我尝试将函数调用附加到每个图像的 onload 事件并计算它被调用的次数。

<html>

<head>
    <script>

    var tractor;

    function Tractor()
    {
        this.init_graphics();
    }

    Tractor.prototype.init_graphics = function()
    {
        this.gr_max = 3;
        this.load_count = 0;

        this.loading_complete(); // #1 test call, works OK

        this.img1 = new Image();
        this.img1.onload = this.loading_complete; // #2 gets called, but gr_max = undefined, load_count = NaN
        this.img1.src = "http://dl.dropbox.com/u/217824/tmp/rearwheel.gif"; //just a test image
    }

    Tractor.prototype.loading_complete = function()
    {
        this.load_count += 1;
        alert("this.loading_complete, load_count = " + this.load_count + ", gr_max = " + this.gr_max);
        if(this.load_count >= this.gr_max) {this.proceed();}
    };

    function start()
    {
        tractor = new Tractor();
    }
    </script>
</head>

<body onload="start();">
</body>

</html>

当它只是从对象的另一个函数调用时(参见#1),它的工作方式正如我所预期的那样。但是,当从 onload 事件调用它时(请参阅#2),变量会变为“未定义”或“NaN”或其他内容。发生了什么?我究竟做错了什么?我该如何让它发挥作用?

我不记得以前用 Javascript 创建过自己的对象,所以我对“我的代码出了什么问题”之类的问题深表歉意。我用了本文 http://www.phpied.com/3-ways-to-define-a-javascript-class/主要参考1.2节。

以防万一,我把相同的代码放在http://jsfiddle.net/ffJLn/ http://jsfiddle.net/ffJLn/


bind回调的上下文:

this.img1.onload = this.loading_complete.bind(this);

See: http://jsfiddle.net/ffJLn/1/ http://jsfiddle.net/ffJLn/1/(与你的相同,但添加了此内容)

这是如何进行的解释bind详细作品:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

基本思想是它使this在绑定函数中等于您作为参数传递给的任何内容bind.

另一种选择是创建一个闭包:

var self = this;
this.img1.onload = function() { self.loading_complete() };

闭包是保留对其上下文的引用的函数(事实上,javascript 中的所有函数都以这种方式工作)。所以在这里你创建一个匿名函数来保存对self。所以这是维护上下文的另一种方法loading_complete拥有权利this.

See: http://jsfiddle.net/ffJLn/2/ http://jsfiddle.net/ffJLn/2/(与你的相同,但有第二种可能性)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 onload 事件调用对象函数会导致其丢失上下文 的相关文章

随机推荐

  • Visual Studio 的未处理异常检查器插件

    我希望能够在编译时询问任何给定的方法 通过调用它可能会引发哪些可能的异常 异常列表应包括任何可能在任何嵌套方法调用中抛出的未捕获的异常 捕获的异常不应包含在列表中 因为我只对可能出现在我自己的代码中的异常感兴趣 是否存在具有该功能或类似功能
  • SQL过滤查询

    我有一个表 其中有许多字段 我正在尝试在 asp net 中创建搜索过滤器 以便用户可以按一个或多个字段的组合进行搜索 所以基本上我想创建一个接受 4 个参数的单个存储过程 如果它不为空 它会将参数附加到 WHERE 子句 TableExa
  • Rails,向新路线添加参数

    The new操作通常不需要参数 因为它从头开始创建新资源 在我的应用程序中 每当我创建某种类型的资源时 就会说book我需要提供一个模板 这是另一个模板的idbook So my new路线总是有一个参数 我不知道如何将这个事实表示为ro
  • 如何使用 VSTS 发布管理部署到 Azure 资源组

    我是 Visual Studio Team Services 发布管理的新手 我的目标是自动将 ASP NET MVC 应用程序部署到 Azure 应用服务 通过尝试不同的方法 我创建了一个基于证书且使用服务主体 SPN 的服务端点 我的构
  • 如何在 mongodb 中找到附近有纬度和经度的地方?

    我对 mongodb 和 golang 很陌生 我有一个名为 myplace 的集合 它具有以下字段 地点名称 城市 纬度 经度 我的问题是某个地方的用户并搜索附近的地方 我如何查询 mongodb 以查找附近的位置 也在golang中 我
  • SwiftUI TextField:点击时键盘不会显示

    我有一个简单的TextField in a HStack与按钮一起 HStack TextField Level Name text levelName font title padding 10 background RoundedRec
  • 如何在itext 7表格中实现列之间的空间?

    我需要实现一张类似于图中的表格 列之间有空间 我试过 cell setPaddingLeft 10 cell setMarginLeft 10 extractionMediaTable setVerticalBorderSpacing 10
  • 通过读取 web.config 来更改 Web 服务的 url [重复]

    这个问题在这里已经有答案了 我有一个使用 asmx Web 服务的 WCF 应用程序 我在应用程序的一百万个地方使用了网络服务 public string LogOnUser string username string password
  • 从 javascript 使用 Microsoft Office Word 打开本地文档

    我的问题很简单 考虑一个可用的word文档 C TestDocument docx 我想要的只是来自我的 javascript 网站的命令 以使用 Microsoft Office Word 应用程序打开此文档 我不想在浏览器上呈现该文档
  • FLAG_TURN_SCREEN_ON 并不总是有效

    我从 BroadcastReceiver 启动一个活动 该活动由警报 RTC WAKEUP 类型 触发 在该活动的 onCreate 中我添加这些标志 getWindow addFlags WindowManager LayoutParam
  • 当属性和构造函数参数类型不同时,System.Text.Json(但不是 Newtonsoft.Json)中的 JsonConstructorAttribute 会导致异常

    给定一个 Base64 字符串 以下示例类将使用正确的反序列化Newtonsoft Json 但不与系统 Text Json using System using System Text Json Serialization public
  • 如何挂载express.js子应用程序?

    我有几个应用程序正在尝试合并到一个 套件 中 2 个应用程序是独立的 一个只是一个身份验证层 使用 everyauth 进行 FB Connect 我想这样设置 主页 应用程序列表 auth 登录任何应用程序 app1 需要通过 auth
  • Jackson 不同的 JSONFilter 相同的类

    我试图使用不同的 JsonFilters 来序列化同一类的对象 想象一下 Foo 类 public class Foo Bar p1 Bar p2 和类酒吧 JsonFilter myFilter public class Bar Stri
  • 将 document.ready 函数移至单独的 javascript 函数?

    是否可以将 jQuery document ready 函数中的以下代码移动到单独的 javascript 函数中 以便可以像任何其他 javascript 函数一样调用它 即
  • Bash 还是 KornShell (ksh)? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 nix 并不陌生 但是最近我花了很多时间在提示符上 我的问题是使用 KornShell ksh 或 Bash Shell 的优点是什么 使用其中
  • JSLint:控制注释(选择性忽略)

    Does JSLint http www jslint com有类似 JavaScript Lint 的东西控制评论 http www javascriptlint com docs index htm e g jsl fallthru 使
  • 线程安全字典.Add

    Is Dictionary Add 仅插入时线程安全吗 我有一个从多线程插入键的代码 我还需要锁定 Dictionary Add 我在添加新密钥时遇到此异常 Exception Source mscorlib Exception Type
  • 添加物化包时出现流星错误

    我刚刚创建了一个空的流星应用程序 它看起来包括物化 https atmospherejs com materialize materialize通过运行打包到流星应用程序中meteor add materialize materialize
  • 基于 PCL Xamarin.Forms.Core 项目的 .NET 标准

    我读到 NET Standard 现在比 PCL 类库更适合共享代码 我的问题是我应该使用 NET Standard 库而不是 PCL 作为 Xamarin Forms 解决方案的核心吗 目前 它将针对 iOS 和 Android 但我们希
  • 从 onload 事件调用对象函数会导致其丢失上下文

    我想在加载所有必需的图像时调用一个函数 图像的数量是预先知道的 因此我尝试将函数调用附加到每个图像的 onload 事件并计算它被调用的次数