Javascript 在DOM ready中调用函数

Javascript 在DOM ready中调用函数,javascript,html,dom,Javascript,Html,Dom,我有一个Javascript库,不幸的是我不应该改变它。 有一个DOM就绪函数,我需要在其中调用一个函数,代码如下: function ready(fn){ if (document.readyState != 'loading'){ console.log('fn called'); fn(); } else { console.log('fn loaded');

我有一个Javascript库,不幸的是我不应该改变它。 有一个DOM就绪函数,我需要在其中调用一个函数,代码如下:

function ready(fn){
        if (document.readyState != 'loading'){
            console.log('fn called');
            fn();
        }
        else {
            console.log('fn loaded');
            document.addEventListener('DOMContentLoaded', fn);
        }
    }   
    ready(function(){

        function hello() {
            console.log("hello world!");
        }
    });
然后我需要从这个范围之外的另一个函数调用hello,比如:

function btnstart(){

        hello();
    }

我怎么能做到

这是对您的问题的更详细的解释。这不是一个答案,我不希望它被接受。这是为了帮助您理解为什么不能按要求执行,除非您可以更改现有代码


您面临的问题是创建一个包含
hello()
的匿名函数,然后将其传递给另一个函数。在该匿名函数的作用域之外,
hello()
不存在,因此无法访问

就拿这个例子来说

function domReady(fn) {
    fn.hello();
}

domReady(function() {
    function hello() {
        console.log("hello");
    }
});
这将创建一个匿名函数并将其传递给
domReady()
,后者反过来将其引用为
fn
。但是,这也会失败,因为
fn
没有名为
hello()
的函数。如果调用
fn()
,则将创建该方法,但该方法仍仅存在于该函数中

您真正需要做的是将
hello()
移出
domReady()
的范围,并将其作为引用传递,如下所示

function domReady(fn) {
    fn();
}

function hello() {
    console.log("hello");
}

domReady(hello); // note there are no parenthesis () after hello, so it is a reference and not immediate executed

如果您可以更改,那么您可以随时调用
hello()
(在相同的范围内)。如果无法更改,则无法执行要求的操作。

访问该函数的唯一方法是从其父函数的作用域返回该函数,或将其分配给某个对象引用,例如
窗口
,在这种情况下,该函数将变为全局可访问函数
window.hello=function hello(){console.log(“hello world!”);}
能否更改调用
ready()
的代码?为什么需要在
ready
内部声明
hello
?这段代码也没有在
ready
中调用
hello
。我的问题是我无法更改ready(),在这种情况下,我必须从外部调用hello()函数。@hamed调用hello的唯一方法是在某处引用它。您不需要更改ready函数,只需要更改annonymus函数,该函数作为参数传递给ready函数以公开hello函数。当你定义hello时,就像我在第一篇评论中告诉你的那样定义它,你可以称之为hello谢谢,这个解决方案工作正常。哦,好的。我以为你除了解释之外什么都听不懂。我很高兴这有帮助:)