简体   繁体   English

在函数数组中引用另一个函数

[英]Referencing another function in array of functions

I'm using require.js and have a library of functions I use in multiple places. 我正在使用require.js,并具有在多个地方使用的函数库。 I define the functions thusly: 我因此定义了这些功能:

define(function (require) {

    "use strict";

    var $ = require('jquery');

    var UsefulFuncs = {};

    UsefulFuncs.hideAlert = function() {
        $('.alert').hide();
    };


    UsefulFuncs.loadURL = function (url){
            navigator.app.loadUrl(url, { openExternal:true });
            return false; 
    };


    UsefulFuncs.linkClicked = function (e) {    
        e.preventDefault();
        var url = $(e.currentTarget).attr("rel"); 
        this.loadURL(url);
    };


    return UsefulFuncs;

});

Then, in my backbone view, I call a function from the library with: 然后,在主干视图中,我使用以下代码从库中调用一个函数:

UsefulFuncs         = require('app/utils/useful_func'),

....

UsefulFuncs.linkClicked

This works fine for any standalone function in the library eg hideAlert(). 这对于库中的任何独立功能(例如hideAlert())都适用。 However when one function in the library refers to another, such as linkClicked() calling loadURL(), I get an error: 但是,当库中的一个函数引用另一个函数时,例如linkClicked()调用loadURL(),我得到一个错误:

Uncaught TypeError: Object [object Object] has no method 'loadURL'. 

Any ideas how I can reference loadUrl()? 有什么想法可以参考loadUrl()吗?

Try something like this: 尝试这样的事情:

define(function (require) {

    "use strict";

    var $ = require('jquery');

    var hideAlert = function() {
        $('.alert').hide();
    };


    var loadURL = function (url){
            navigator.app.loadUrl(url, { openExternal:true });
            return false; 
    };


    var linkClicked = function (e) {    
        e.preventDefault();
        var url = $(e.currentTarget).attr("rel"); 
        loadURL(url);
    };


    return {
        hideAlert : hideAlert,
        loadURL : loadURL,
        linkClicked : linkClicked
    };

});

I would assume you set UsefulFuncs.linkClicked as a handler for an event. 我假设您将UsefulFuncs.linkClicked设置为事件的处理程序。

If you were to use it like this: 如果要像这样使用它:

UsefulFuncs.linkClicked()

, this inside the function would refer to UsefulFuncs , so this.loadURL() would be valid. this函数内部的这个对象将指向UsefulFuncs ,因此this.loadURL()是有效的。

However, since you set it as a handler for an event, it can be called in other ways, and this is set to some other object (probably the element which triggered the event). 但是,由于您将其设置为事件的处理程序,因此可以通过其他方式调用它,并将this设置为其他某个对象(可能是触发事件的元素)。 To avoid the event handling mechanism changing your this , you can bind the function when you assign it: 为了避免事件处理机制更改this ,可以在分配函数时绑定该函数:

element.onclick = UsefulFuncs.linkClicked.bind(UsefulFuncs);

Another way to go around it is to avoid using this in the handler, like so: 解决该问题的另一种方法是避免在处理程序中使用this ,如下所示:

UsefulFuncs.linkClicked = function (e) {    
    e.preventDefault();
    var url = $(e.currentTarget).attr("rel"); 
    UsefulFuncs.loadURL(url);
};

This creates a closure over UsefulFuncs (the first method does as well, but it's more standardized). 这将创建对UsefulFuncs的闭包(第一种方法也可以,但是更加标准化)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM