問題:在web專案前端實現時,有兩個小功能模組,一方面想自我要求必須物件導向的方式實現,另一方面此功能模組沒有相同的模式,不需要用類多次例項化,因此建立乙個單例是最好的選擇。單例的js實現有多種方式:
1.以物件實現
var singleton = ,
func2: function(){}
}
缺陷是沒有建構函式,不能執行初始化方法(用為靜態類方法使用還行)
2.匿名函式實現:這是最簡單的實現方式,不作任何額外處理,定義類然後立即執行。3.單例的高階實現:控制不允許新的例項物件產生沒有考慮第三種,是因為它過於麻煩,為建立單例需要額外花些指令碼控制例項的唯一性。採用在第2種方法實現如下:
後面發現,程式執行時,在同一頁面的這兩個模組互聯測試時頁面錯亂。這兩個模組的實現幾乎相同,都是init、createhtml、bindevent等基礎方法。除錯時發現,這個方法裡面的this不是匿名函式object,而是window。經多次測試,才理解this在function中什麼時候是全域性物件window,什麼時候是當前類物件。將function宣告的函式,作為函式呼叫時,它始終都是全域性物件(web頁面中是window,如在nodejs那可能就是global了);它此函式以new例項化時,其中的this就是object物件。與是否匿名函式無關。知道原因,解決方法就簡單了,還是用第2種思路上實現修改一:在前面新增new關鍵字//錯誤的實現
var singleton = function()();
var singleton = new function();
修改二:結合思路1的實現,較思路1純物件實現好的地方是,本方法可以新增初始化邏輯。
var singleton = function()
}; me.func2= function(){}
return me;
}();
JS中的全域性變數
全域性變數,區別於區域性變數,可供當前程式所有物件或方法所使用 js中全域性變數的生命定義方式有以下三種 1.在所有方法 function 的外部 注 還須在最前 使用var關鍵字定義,如 var level 1 全域性變數 function func 2.直接使用變數,如 level 1 注 使用...
函式中「引用」全域性變數和「修改」全域性變數的差別
以下程式中,函式中可以直接列印出全域性變數x,而無須使用關鍵字global html view plain copy print?x 1 def run print x if name main run 當在函式中需要修改全域性變數時,如果沒有global關鍵字則會出錯 python view pl...
PHP中全域性變數和超全域性變數
自定義全域性變數的作用域為當前的指令碼檔案的任意位置 函式或者方法啊之類的 但是要想用它們必須先執行一下 global variable語句 variable為要使用的全域性變數 或者是使用 global 變數名字 來呼叫。超全域性變數作用於也是為當前的指令碼檔案的任意位置,在使用的時候無需先執行 ...