函數表達式和函數聲明:
function foo(){} // 聲明,因爲它是程序的一部分
var bar = function foo(){}; // 表達式,因爲它是賦值表達式的一部分
函數聲明會在代碼塊中被提到最前面,而表達式不會。
alert(fn());
function fn() {
return 'Hello world!';
}
()是一個分組操作符,它的內部只能包含表達式,在使用eval對JSON進行執行的時候,JSON字符串通常被包含在一個圓括號裏:eval('(' + json + ')'),這樣做的原因就是因爲分組操作符,也就是這對括號,會讓解析器強制將JSON的花括號解析成表達式而不是代碼塊。
Module模式
var Calculator = function (eq) {
//這裏可以聲明私有成員
var eqCtl = document.getElementById(eq);
return {
// 暴露公開的成員
add: function (x, y) {
var val = x + y;
eqCtl.innerHTML = val;
}
};
};
var calculator = new Calculator('eq');
calculator.add(2, 2);
每次用的時候都要new一下,也就是說每個實例在內存裏都是一份copy。
匿名閉包
(function () {
// ... 所有的變量和function都在這裏聲明,並且作用域也只能在這個匿名閉包裏
// ...但是這裏的代碼依然可以訪問外部全局的對象
}());
對module進行擴展,添加新的屬性:
var module = (function(mod){
mod.moreFunc = function(){};
...
return mod
})(module || (module = {}))
若module已經存在,那麼添加新的功能,若不存在,初始化爲空對象再添加功能。
克隆
for (key in old) {
if (old.hasOwnProperty(key)) {
my[key] = old[key];
}
}
function的執行
在function後面加個()就能執行一個方法,但是有一個需要注意的地方:
function(){}()
該句會報錯,原因是方法是聲明式,所以不會生成一個有名字的對象來供()調用,但是用()包圍起來當作表達式就可以了:
(function(){})()