js函式中this是全域性變數還是當前物件

2021-07-09 13:51:53 字數 1027 閱讀 7339

問題:在web專案前端實現時,有兩個小功能模組,一方面想自我要求必須物件導向的方式實現,另一方面此功能模組沒有相同的模式,不需要用類多次例項化,因此建立乙個單例是最好的選擇。單例的js實現有多種方式:

1.以物件實現

var singleton = , 

func2: function(){}

}

缺陷是沒有建構函式,不能執行初始化方法(用為靜態類方法使用還行)

2.匿名函式實現:這是最簡單的實現方式,不作任何額外處理,定義類然後立即執行。3.單例的高階實現:控制不允許新的例項物件產生沒有考慮第三種,是因為它過於麻煩,為建立單例需要額外花些指令碼控制例項的唯一性。採用在第2種方法實現如下:

//錯誤的實現

var singleton = function()();

後面發現,程式執行時,在同一頁面的這兩個模組互聯測試時頁面錯亂。這兩個模組的實現幾乎相同,都是init、createhtml、bindevent等基礎方法。除錯時發現,這個方法裡面的this不是匿名函式object,而是window。經多次測試,才理解this在function中什麼時候是全域性物件window,什麼時候是當前類物件。將function宣告的函式,作為函式呼叫時,它始終都是全域性物件(web頁面中是window,如在nodejs那可能就是global了);它此函式以new例項化時,其中的this就是object物件。與是否匿名函式無關。知道原因,解決方法就簡單了,還是用第2種思路上實現修改一:在前面新增new關鍵字
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 變數名字 來呼叫。超全域性變數作用於也是為當前的指令碼檔案的任意位置,在使用的時候無需先執行 ...