首先,必須指出,myFunction
是構造函數。然而,標識符中的第一個字母不是大寫。請撥打MyFunction
。
如果在沒有new
運算符的情況下調用構造函數,則將this
綁定到瀏覽器中的全局對象,即window
。這使得大寫公約成爲我們發現這種事故的唯一途徑。
的下面幾行代碼演示了此:
// After the original code...
myFunction();
console.log(window.myVar); // logs "myVar"
其次,要能任意陣列上應用,而不是改變Array.prototype
功能,考慮以下因素:
var utils = {array: {}}; // utils.array is a container for array utilities.
utils.array.each = function (array, func) {
var i;
for (i = 0; i < array.length; i += 1) { func(array[i]); }
};
utils.write = function (s) {
console.log(s); // Alternatively, document.write(s);
};
utils.array.each([1, 2, 3], utils.write); // prints 1 2 and 3 (on separate lines)
請注意,我們沒有使用this
和new
。它們使JavaScript看起來像Java,除此之外,它們很少有用處。
雖然庫可能修改Object.prototype
和Array.prototype
,但最終開發人員不應該這樣做。
此外,我們應該(理想)可以這樣做:
utils.array.each([1, 2, 3], console.log);
或
utils.array.each([1, 2, 3], document.write);
。
但是大多數瀏覽器都不會允許它。
希望這有助於。
你爲什麼要這麼做?看起來像一個XY問題... – elclanrs
所以我不必記得綁定或通過「this」每次我循環一個數組 –
答案顯然是「否」,JavaScript函數無法確定'這在調用者。這就是爲什麼'Function.bind()'和箭頭函數存在的原因。 –