JavaScript:分别声明和定义函数?

JavaScript:分别声明和定义函数?,javascript,function,scope,declaration,definition,Javascript,Function,Scope,Declaration,Definition,如果我想给出JavaScript变量的全局作用域,我可以很容易地做到这一点: var myVar; function functionA() { myVar = something; } 是否有一种类似的简单而干净的方法——不创建对象——来分离嵌套函数的“声明”和“定义”?比如: function functionB; // declared with global scope function functionA() { functionB() {

如果我想给出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中,则可以从父文档中的脚本调用它。(与嵌套函数中变量的作用域无关。)

您可以随心所欲

您可以创建一个类似于属性和方法的命名空间的函数,然后您可以本质上调用

functionB();

这里有一篇关于如何做到这一点的文章:

响应更新…


iframe是否与父站点位于同一域中?您不能跨域边界调用JavaScript,这可能会解释问题。

您可以通过在
窗口上创建实例来创建全局变量和函数
对象:

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
    {
    };
}

注意:阻塞全局范围从来都不是一个好主意。如果可以的话;我建议您重新思考代码的工作方式,并尝试封装代码。

也许我误解了这个问题,但听起来您希望这样:

var innerFunc;

function outerFunc() {
    var foo = "bar";

    innerFunc = function() {
        alert(foo);
    };
}

您不能以这种方式跨窗口/iframe全球化变量/函数。每个窗口/iframe都有自己的全局作用域,要在另一个窗口/iframe中定位变量/函数,您需要显式的访问器代码,并遵守。只能访问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);
    }
}
我习惯于将独立函数声明为变量(函数表达式),并且只使用函数语句来表示构造函数/伪类。它还避免了一些可能令人尴尬的错误。。在任何情况下,fnB都位于iframe的全局范围内,可用于顶部窗口

var iframe = document.getElementById('iframeId');
var iframeContext = iframe.contentWindow || iframe;

// this will only work if your iframe has completed loading
iframeContext.yourFunction();

我不明白你为什么要这样做,似乎几个月后调试或更新会变得更复杂。

我想知道你在用javascript这样的东西寻找什么?Amirouche——请看我在主要问题文本中添加的说明……顺便说一句,大家都注意到,当我遇到这个问题时,是的,我只是取消了函数的嵌套并解决了问题:)我只是从理论的角度对它感到好奇。我不太了解它的理论,但我们在web应用程序中也这样做,以加载通过iFrame的小部件。所以至少我们有两个人可以做到这一点!我更新了原始问题,以澄清我试图从父脚本访问iframe脚本中的嵌套函数。我已经尝试了这两种语法,但是父脚本似乎无法使用它们调用嵌套的iframe函数——例如,IFRAMEREFERENCE.contentWindow.myFn什么都不做,IFRAMERENCE.contentWindow.myFn()没有给出错误的函数。好的,我已经发现我需要先运行randomFn(),才能得到myFn的代码“已评估”(?),然后我可以毫无问题地从父级调用myFn(),所以这个函数表达式代码完全回答并解决了原始问题。谢谢你的帮助。请看我在roosteronacid的回答中的评论。。。TxAll相同的域(实际上在本地计算机上)。我现在有了roosteronacid的密码。。。看看我对鸡酸的反应。我需要从父文档在iframe中调用这个嵌套函数。我不认为有任何方法可以这样调用“innerFunc”?是的,有:任何全局变量(如
innerFunc
)都会成为全局对象的属性,映射到浏览器中的窗口对象
document.getElementById(“your_iframe”).contentWindow.innerFunc()
就可以了。好吧,我发现我需要先运行outerFunc(),以获得innerFunc的代码“evaluated”(?),然后我可以毫无问题地从父级调用innerFunc()。因此,这个函数表达式代码完全回答并解决了最初的问题。谢谢你的帮助。你说:“你不能以这种方式将[…]函数全球化到windows/iFrame上”。我怀疑这就是我问题的答案。iframe中的函数必须在iframe脚本的全局空白中声明和定义,父脚本才能调用它。问题2。你说:“你不能用那种方式使变量全球化。对于iframe中的变量,当然可以在全局空白中声明它们并在本地定义它们。也许您指的是一些高级语法,将本地声明的变量“公开”到iframe的全局范围…?问题3。当你说:“var-iframeContext=iframe.document | | iframe.contentWindow.document”--这是实际的“代码”还是“代码,还是伪代码,表明我选择使用哪一个?”问题4。您的“top.document.myFunction=function()”代码看起来非常有趣,但我发现了一个解析错误。| |确实是“OR”,这不是布尔表达式的专有项;)我澄清了我的awnser,解析错误是由于输入错误(句号而不是分号)。还删除了.document引用,我们需要以窗口(全局)对象为目标;)