scope - 调用在书签内创建的函数

标签 scope bookmarklet javascript

我正在尝试编写一个小书签,它将 JSONP 调用添加到这样的页面中:

javascript:(function(){
var myFunction = (window.function(data){alert('my function is firing with arg' + data)});
var j = 'http://localhost/jsonscript.js';
var s = document.createElement('script');
s.src = j;
document.getElementsByTagName('head')[0].appendChild(s);
})();

附加到页面的脚本 src 包含

myFunction('foo');

但是当我单击小书签时出现错误 -- 未定义 myFunction。我如何“导出”我的小书签范围之外的功能,以便在从附加的脚本标记调用时它可以工作?

编辑:我发现我可以用原始 JavaScript 打包脚本元素的 innerHTML。这行得通,但很难看。我仍然想找出更好的方法。

最佳答案

在窗口对象上定义函数:

window.myFunction = ...

对于 JSONP 请求,您通常需要某种类型的计数器来递增,即:

var counter = 1;
var myFuncName = "myFunction" + counter;
var j = 'http://localhost/jsonscript.js?callback=' + myFuncName;
window[myFuncName] = function (data) {...};

// remove function after timeout expires
setTimeout(function () { delete window[myFuncName] }, 5000);

关于scope - 调用在书签内创建的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15734691/

相关文章:

c++ - 如何从 if 语句中获取类模板的实例? (C++)

Java返回值、对象引用

javascript - 是否有 javascript 可以删除 Youtube 播放列表中的重复视频?

javascript - 将图标添加到 javascript Bookmarklet(使用 window.open)

javascript - 使用 localStorage 和 sessionStorage 作为元素树

javascript - 将 meteor 应用程序部署到域和别名

c - 数组在void函数里改了,外面还是改了!为什么? (范围)

delphi - 匿名方法的范围

javascript - 在现代浏览器中,JavaScript 小书签是否有任何安全限制?

javascript - jquery.find() 可以只选择直接 child 吗?