将局部变量传递给我只能进行有限更改的函数

时间:2013-04-13 15:01:10

标签: javascript callback global-variables jsonp closures

我刚刚开始使用JavaScript而且在SO上找不到这样的确切场景,所以我要试试运气。我在外部JS文件中有两个函数,它们在我们的网站上创建视频源:

function getVideos() {
    //gets a list of videos
}

//callback function automatically called by getVideos()
function response(jsonData) { //can't change this line
    var resp = document.getElementById("resp"); //can change this line and any subsequent lines
    //parses data and populates resp
}

然后,从HTML方面,我们只需调用getVideos(),即可创建并填充视频供稿。

但是,我希望能够将我想要的任何元素ID传递给response(),以便我们可以在同一页面上的不同位置创建多个视频源。问题是我无法更改response()的函数声明以包含另一个参数。或者至少我不会相信我可以通过主办我们视频的公司。

我尝试用getVideos()包装response()并从那里传递一个元素ID,但是后来没有调用response(),我能想到的唯一解决方案是使用存储元素ID一个全局变量,我知道这在JavaScript中是一个禁忌。

我的问题是:我只是咬紧牙关并使用全局变量,还是有另一种方式?

有关更多信息,请参阅我们现在的JS代码(使用闭包):http://www.thebearrocks.com/Other/js/videoFeed/createVideoFeed.js 以下是我们从视频主持人那里得到的关于响应()的教程:http://support.brightcove.com/en/video-cloud/docs/making-media-api-calls-dynamic-script-tags

2 个答案:

答案 0 :(得分:0)

可能你可以使用参数吗?像这样:

function response(jsonData) { //callback function automatically called by getVideos()
    var elemId = arguments.length<2 ? "resp" : arguments[1]+"";
    var resp = document.getElementById(elemId);
    //parses data and populates resp
}

或者,声明第二个参数具有默认值,如下所示:

function response(jsonData, elemId) { 
    elemId = elemId || "resp";
    var resp = document.getElementById(elemId);
    //parses data and populates resp
}

在这种情况下,可以使用一个或两个参数调用函数

答案 1 :(得分:0)

  

我尝试用getVideos()包装response()并从那里传递一个元素ID,但是后来没有调用response(),我能想到的唯一解决方案是使用存储元素ID一个全局变量,我知道这在JavaScript中是一个禁忌。

     

我的问题是:我只是咬紧牙关并使用全局变量,还是有另一种方式?

没有。不是id变量需要变为全局变量,但是您的本地response函数需要从JSONP script回调 - 您将创建closure

您可以通过调用

“导出”它
window.response = mylocalResponseFunction; // you did name that local var "response"