函數表達式和函數聲明/()是一個分組操作符/Module模式/匿名閉包/克隆/function的執行

函數表達式和函數聲明

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(){})()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章