5

几周以来我一直在研究框架开发,我遇到了在 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,而不仅仅是预先打包的东西。

一个好的答案应该包含:

  • 一个很好的资源,它解释了立即调用匿名函数背后的逻辑
  • 对该链接的见解
  • 我提供的代码做错了什么
4

2 回答 2

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/apps/learn/

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

http://javascript.crockford.com/prototypal.html

于 2013-01-25T20:29:16.450 回答
2

如果你想了解 JS 设计模式,我强烈推荐Addy Osmani 的书籍/文章。他使事情变得非常简单,通常会提供相当多的示例代码来帮助您理解。就您的代码和实现设计模式而言,这取决于您希望代码做什么,以及您希望代码/对象如何表现。在开始编码之前了解您的需求/目标非常重要,这样您就不会迷失在真正无法解决特定问题的意大利面条式模式中。

在某些情况下,为复杂的大型应用程序实现一个模式简直是矫枉过正。

由于其他人已经正确地指出了您的代码的问题,我将把它留在那里。

于 2013-01-25T20:34:24.007 回答