在另一个文件中调用Function Expression中的函数总是会给出未定义的错误

时间:2014-04-20 20:14:49

标签: javascript

所以,我在js中非常新手,并试图模仿我见过的函数的实现,但它给出了错误。搜索和搜索我既不理解什么是错的,也不理解与某些例子有什么不同......下面的所有内容都只是我正在做的事情的一种表现。

我有两个js脚本,Flower.jsTree.js 所以,我模仿的功能或多或少像Flower.js

var Lily = (function() {

    function petal() {
        //do A
    }
})();

Tree.js内,我试图像这样打电话给petal

function grow() {
    Lily.petal();
}

我把它们放在html中这样:

<script src="js/Flower.js"></script>
<script src="js/Tree.js"></script>

但它没有给出任何结果,总是给出错误

  

未捕获的TypeError:无法读取未定义的属性'petal'

我试图改变这一点,并且错误发生了变化,但无论我做了什么更改,它总是在错误消息中有undefined。我做过的严重错误是什么?是在声明中还是在调用函数?

2 个答案:

答案 0 :(得分:0)

我认为你需要的是:

var Lily = (function() {

    this.petal = function () {
        //do A
    }
});

您在函数末尾的额外()导致它立即执行:换句话说,您创建了所谓的IIFE:立即调用函数表达式。 Lily被赋予了该函数的返回表达式的值,并且由于您没有返回任何内容,因此默认设置为undefined

此外,由于您没有将petal实际指定为Lily的属性,即使已定义Lilypetal也将被取消定义。由于在function petal函数中说Lily并未将该属性添加到包含函数,因此您必须通过将该属性添加到this来指定该属性。

答案 1 :(得分:0)

在您的示例中,花瓣功能可以称为“Lily模块的私有功能” 下面的代码声明了一个立即调用的函数,因此Lily的值是函数的返回值。

如果你想从Lily访问Petal你可以尝试这样的事情:

var Lily = (function() {

    return {
        petal : function() {
            console.log('Petal has been called');
        },
        someOtherMethod : function () {
           console.log('someOtherMethod has been called');
        }
    }
 })();

Lily.petal(); Lily.someOtherMethod();