如果我想提供一个JavaScript变量全局范围,我可以轻松地执行此操作:
var myVar;
function functionA() {
myVar = something;
}
是否有一种类似的简单而干净的方式 - 不创建对象 - 分离嵌套函数的“声明”和“定义”?类似的东西:
function functionB; // declared with global scope
function functionA() {
functionB() { // nested, would have local scope if declared here
CODE;
}
}
我应该澄清一下,我指的是函数名称本身的范围 - 因此,如果它在iframe中,则可以从父文档中的脚本调用它。 (与嵌套函数中的变量范围无关。)
答案 0 :(得分:1)
您可以通过在window
对象上创建实例来创建全局变量和函数:
function _A()
{
// scoped function
function localFunctionInTheScopeOf_A()
{
}
// global function
window.globalFunctionOutsideTheScopeOf_A = function ()
{
};
}
在您的情况下,您需要做的就是:
var myFn; // global scope function declaration
function randomFn()
{
myFn = function () // global scope function definition
{
};
}
注意:堵塞全局范围绝不是一个好主意。如果你可以的话;我建议您重新考虑代码的工作原理,并尝试封装代码。
答案 1 :(得分:1)
也许我误解了这个问题,但听起来你想要这样的事情:
var innerFunc;
function outerFunc() {
var foo = "bar";
innerFunc = function() {
alert(foo);
};
}
答案 2 :(得分:1)
你无法通过这种方式全局化变量/函数交叉窗口/ iframe。每个窗口/ iframe都有自己的全局范围,并且在另一个窗口/ iframe中定位变量/函数,您需要显式的访问者代码并符合same origin policy。只能访问windows / iframes全局范围内的变量/函数。
顶部窗口中的代码。
var iframe = document.getElementById('iframeId');
var iframeContext = iframe.contentWindow || iframe;
// this will only work if your iframe has completed loading
iframeContext.yourFunction();
您也可以在顶部窗口中定义函数/变量,只需通过闭包从iframe绑定所需的内容即可在一个范围内工作。再次,假设您符合相同的原始政策。这不适用于跨域。
iframe中的代码。
var doc = document;
var context = this;
top.myFunction = function(){
// do stuff with doc and context.
}
还需要注意的是,您需要检查iframe内容及其脚本是否已完全加载。在您的iframe内容完成之前,您的首页/窗口将无意中完成并运行,可能尚未声明ergo变量/函数。
至于暴露私人功能,其他人已经认识到这一点,但复制/粘贴是为了完整。
var fnB;
var fnA = function(){
var msg = "hello nurse!";
fnB = function(){
alert(msg);
}
}
我有将单独的函数声明为变量(函数表达式)的habbit,并且仅使用函数语句来表示构造函数/伪类。它还避免了一些可能的尴尬错误。在任何情况下,fnB都位于iframe的全局范围内,并且可用于顶部窗口。
为什么你想让这个打败我,似乎在几个月之后调试或更新会变得更加复杂。
答案 3 :(得分:0)
你可以做你想做的事。
你可以创建一个像属性和方法的命名空间一样的函数,然后你可以基本上调用...
functionB();
或
functionA.functionB();
这里有一篇关于如何做的文章:
http://www.stevefenton.co.uk/Content/Blog/Date/201002/Blog/JavaScript-Name-Spacing/
响应更新......
iframe与父网站位于同一个域中吗?您不能跨域边界调用JavaScript,这可以解释问题。