所以,我在js中非常新手,并试图模仿我见过的函数的实现,但它给出了错误。搜索和搜索我既不理解什么是错的,也不理解与某些例子有什么不同......下面的所有内容都只是我正在做的事情的一种表现。
我有两个js脚本,Flower.js
和Tree.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
。我做过的严重错误是什么?是在声明中还是在调用函数?
答案 0 :(得分:0)
我认为你需要的是:
var Lily = (function() {
this.petal = function () {
//do A
}
});
您在函数末尾的额外()
导致它立即执行:换句话说,您创建了所谓的IIFE:立即调用函数表达式。 Lily
被赋予了该函数的返回表达式的值,并且由于您没有返回任何内容,因此默认设置为undefined
。
此外,由于您没有将petal
实际指定为Lily
的属性,即使已定义Lily
,petal
也将被取消定义。由于在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();