准备好在DOM中调用函数

时间:2018-07-03 10:39:53

标签: javascript html dom

我有一个Javascript库,很遗憾,我不应对其进行更改。 有一个DOM Ready函数,我需要在其中调用一个函数,代码如下:

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!");
        }
    });

然后我需要从此范围之外的其他函数中调用你好

function btnstart(){

        hello();
    }

我该怎么做?

1 个答案:

答案 0 :(得分:1)

这是对您的问题的详细解释。这不是答案,我不希望它被接受。这是为了帮助您理解为什么您不能做自己要问的事情,除非您可以更改现有代码。


您面临的问题是创建一个包含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()。如果您无法更改该内容,那么您将无法执行自己的要求。