201207241756ECMAScript 5 Strict mode 與否 call apply 差異

在非 ECMAScript 5 Strict mode ,也就是一般熟悉的 JavaScript 環境下, callapply 的第一個參數傳入 null 或 undefined,函式中的 this 會設定為環境的 global object ,瀏覽器環境中 global object 就是 window :

function f() { alert(this); }

f.call(null); // [object Window]
f.call(undefined); // [object Window]

 

但是在 ECMAScript 5 Strict mode 下, call 和 apply 的第一個參數傳入 null 或 undefined,函式中的 this 就真的是 null 或 undefined :

"use strict";

function f() { alert(this); }

f.call(null); // null
f.call(undefined); // undefined

 

這要特別注意,尤其以往使用 apply 目的是第二個參數,將陣列轉為傳入函式的參數,而非第一個參數,指定函式中 this 時,常會將第一個參數設為 null 表示不指定:

f.apply(null, [1, 2, 3]);

在 ECMAScript 5 Strict mode 下,函式中的 this 就真的會是 null ,而非 global object window 。建議改為:

f.apply(window, [1, 2, 3]);

以符合預期

 

額外一提,如傳進 call 和 apply 的第一個參數是 number 、 string 、 boolean ,會自動轉型為 Wrapper Object NumberStringBoolean 。不論是否在 ECMAScript 5 Strict mode 下, this 皆能設定成功。

function f() { alert(typeof this); }

f.call(1);  // object
f.call('s');  // object
f.call(true); // object
延伸 JavaScript arguments.callee
回應
Google 站內搜尋
BloggerAds
累積 | 今日
loading......
    沒有新回應!





Powered by Xuite