JavaScript:分别声明和定义函数?
如果我想给出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() {
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引用,我们需要以窗口(全局)对象为目标;)