如果這個問題太寬泛,我很抱歉。實際上它有4個不同的問題,但都涉及到同一段代碼,我認爲它們都圍繞相同的原則。Javascript:這個代碼做什麼?
我今天決定,在使用JS多年後,實際上開始學習JS如何工作,而不是像在瀏覽器中運行的C那樣對待它。所以我開始深入研究jQuery代碼,以瞭解真正的JS開發人員如何使用該語言。那時候我發現了一段代碼,看起來像下面的代碼。請注意,我從另一個堆疊的帖子In Javascript, can you extend the DOM?處取下此代碼。所以這並不意味着寫這段代碼的人甚至知道他在說什麼。
var myDOM = (function(){ // #1
var myDOM = function(elems){ // #2
return new MyDOMConstruct(elems);
},
MyDOMConstruct = function(elems) {
this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems];
return this; // #3
};
myDOM.fn = MyDOMConstruct.prototype = {
forEach : function(fn) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
fn(elems[i], i);
}
return this;
},
addStyles : function(styles) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
for (var prop in styles) {
elems[i].style[prop] = styles[prop];
}
}
return this;
}
};
return myDOM; // #4
})();
1爲什麼使用var myDOM =(function(){})();來聲明函數。而不是var myDOM = function(){};
2爲什麼要聲明另一個函數在myDOM函數中使用完全相同的名稱?爲什麼不將所有內部myDOM的邏輯放在外部myDOM函數中?
3爲什麼顯式返回「this」?那會自動完成,對嗎?
4這是怎麼回事?它是否返回內部myDOM的構造函數?如果是這樣,爲什麼?
更新
所以大部分的很有道理,現在。關於#1,我認爲myDOM被分配了=之後定義的函數,但事實並非如此。它被分配任何函數返回。這恰好是一個功能。
我還不清楚#3。是的,我明白使用這樣的功能
console.log(MyDomConstruct('foo'))
會顯示'未定義'。但這不是它被使用的方式。一些排隊是這個
return new MyDomConstruct(elems);
我能理解明確地返回「這個」如果語句是這樣進行的
return MyDomConstruct(elems);
但事實並非如此。
實際上'新的MyDomConstruct(elems)'不會返回'this',而是'MyDomConstruct'的新實例。也許在不同的情況下,這更容易理解。 – nre 2010-10-21 07:09:27
對。但是「this」和MyDomConstruct的一個新實例都是MyDomConstruct的實例,不是嗎?此外,爲什麼即使使用「新」的語句,如果函數將返回自己的一個實例? – mellowsoon 2010-10-21 07:21:45
所有不錯的答案。我給傑迪回答,因爲他先回答,但是對其他人回答+1。 – mellowsoon 2010-10-21 07:32:49