javascript - JSONP 回调和闭包/范围

标签 javascript jsonp scope

我正在使用来自 http://www.microsofttranslator.com/dev/ 的 Microsoft Translation api(AJAX 版本)

我在闭包和回调方面遇到了一些问题,我希望这段代码能够证明这一点:

function translate(original){

    window.translateComplete = function(language) {

        if (language!="en"){
        alert(original +" "+language);
        }   
    }


    var windowsliveid = 'API_KEY_REMOVED';
    var el = document.createElement("script"); 
    el.src = 'http://api.microsofttranslator.com/V2/Ajax.svc/Detect'; 
    el.src += '?oncomplete=translateComplete'; 
    el.src += '&appId=' + windowsliveid; 
    el.src += '&text=' + escape (original); 
    document.getElementsByTagName('head')[0].appendChild (el);

}

translate("Au Revoir"); 
translate("Hola"); 

现在,我的回复是

Hola es
Hola fr

original 变量在回调有机会执行之前被覆盖。

我如何避免这种情况,以便它显示如下内容:

Hola es
Au revoir fr

我想在不使用 jQuery 和 when() 的情况下做到这一点

谢谢

最佳答案

好吧,自从 window. translateComplete 只能引用一个函数。所以每次调用 translate 都会用一个新函数覆盖 window.translateComplete,这是一个闭包。

您可以为每个调用创建一个具有不同名称的新回调。这就是 jQuery 正在做的事情。

最简单的形式:

var i = 0; // some running variable
function translate(original){

    var cb_name = 'cb' + (i++); // create a new name
    window[cb_name]= function(language) {
        delete window[cb_name]; // remove function to not pollute the global scope
        if (language!="en"){
            alert(original +" "+language);
        }   
    }

    var windowsliveid = 'API_KEY_REMOVED';
    var el = document.createElement("script"); 
    el.src = 'http://api.microsofttranslator.com/V2/Ajax.svc/Detect'; 
    el.src += '?oncomplete=' + cb_name; // use the dynamic name instead
    el.src += '&appId=' + windowsliveid; 
    el.src += '&text=' + escape (original); 
    document.getElementsByTagName('head')[0].appendChild (el);
}

关于javascript - JSONP 回调和闭包/范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10107765/

相关文章:

javascript 操作作用域链内的值

javascript - React-Router v4 <Route render={...}/> 不显示组件

Javascript:在给定对象问题中动态创建函数

python - 在类实例中使用模块变量

java - 在 URL 中传递分号作为参数

php - 在 PHP 中提取 JSON 结果集

javascript - 如何读取jsonp响应

javascript - 如何在 react-beautiful-dnd 中将 onDragStart 附加到 Draggable?

javascript - 使用Bind后访问原型(prototype)

javascript - 循环绑定(bind)以查找循环数