JavaScript:单独声明和定义一个函数?

时间:2010-08-14 14:13:45

标签: javascript function scope declaration definition

如果我想提供一个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中,则可以从父文档中的脚本调用它。 (与嵌套函数中的变量范围无关。)

4 个答案:

答案 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,这可以解释问题。