我已经研究了几个星期的框架开发,并且我遇到了在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()对象?为什么我要使用窗口?
我知道网上有几个关于此的资源,但我无法理解它.其中一些进入细节,其中一些试图详细说明,但未能解释关键的东西.为什么在开发框架时如此强调?
别担心,我不是在试图“重新发明*”,但我想尝试实际学习JavaScript,而不仅仅是预先打包的东西.
一个好的答案应该包含:
>一个很好的资源,它解释了立即调用匿名函数背后的逻辑
>对该链接的洞察力
>我所提供的代码出错了
解决方法:
首先,当您尝试将其分配给全局对象时尚未定义函数,因此未定义:
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是一个函数,而不是一个对象.将新关键字发布到函数时,将创建函数对象.您可以进行此更改以将函数转换为函数对象:
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
http://javascript.crockford.com/prototypal.html