我已经研究了几个星期的框架开发,并且我遇到了在lib开发世界中强烈建议并施压的内容,即立即调用匿名函数。
我永远无法让它工作,我找不到能够详细解释其背后的用法和逻辑的资源。
这是我目前所知道的:
我不仅要寻找一个详细的资源,还要解释其背后的逻辑。因为我发现它非常不合逻辑。
以下是我所拥有的:
(function( window, document, undefined ) {
window.myThingy = myThingy;
var myThingy = function() {
};
myThingy.prototype = {
constructor: myThingy,
create: function( elementToBeCreated ) {
return document.createElement( elementToBeCreated );
}
};
})( window, document );
然后,
myThingy().create("div");
但它仍然说myThingy() [object]
不是一个功能。
我做错了什么?为什么我应该使用立即调用的函数而不仅仅是创建一个全局myThingy = function()
对象?为什么我必须使用window
?
我知道网上有几个关于此的资源,但我无法理解它。其中一些进入细节,其中一些试图详细说明,但未能解释关键的东西。 为什么在开发框架时会如此强调?
不用担心,我并没有尝试重新发明轮子,但我正在努力学习 JavaScript ,不只是预包装的东西。一个好的答案应该包含:
答案 0 :(得分:4)
首先,当您尝试将其分配给全局对象时尚未定义函数,因此它未定义:
window.myThingy = myThingy;
console.log(myThingy);//undefined
您需要在定义myThingy
后执行作业:
(function( window, document, undefined ) {
var myThingy = function() {
};
myThingy.prototype = {
constructor: myThingy,
create: function( elementToBeCreated ) {
return document.createElement( elementToBeCreated );
}
};
window.myThingy = myThingy;
})( window, document );
好的,接下来,您无法使用
myThingy.create("div");
因为myThingy是一个函数,而不是一个对象。函数对象是在向函数发出new
关键字时创建的。您可以进行此更改以将函数转换为函数对象:
window.myThingy = new myThingy();//create a function object
这种模式不是所有框架的实现方式,而是类似的。有时会有更多的抽象。但是,进行这些更改将使您的方法更有效。
以下是您的代码演示:http://jsfiddle.net/ZjRJW/
<强>链接强>
以下是我的一些最爱:
http://ejohn.org/blog/simple-class-instantiation/
http://ejohn.org/blog/simple-javascript-inheritance/
http://jibbering.com/faq/notes/closures/
https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Details_of_the_Object_Model
答案 1 :(得分:2)
如果您想了解JS设计模式,我强烈推荐Addy Osmani's books/articles。他让事情变得非常简单,并且通常会提供相当多的示例代码来帮助您理解。就您的代码和实现设计模式而言,它取决于您希望代码执行的操作以及您希望代码/对象的行为方式。在开始编码之前了解您的要求/目标是非常重要的,这样您就不会迷失在真正无法解决特定问题的模式中。
在某些情况下,实现用于复杂的大型应用程序的模式实在是太过分了。
由于其他人已经正确地指出了您的代码的问题,我将把它留在那里。