case: trackClicksEx๋ผ๋ ๋์ด์ ์ฌ์ฉํ์ง ์๋ ํจ์๊ฐ ์๋ ๋ณ์๋ฅผ ํธ์ถํด error๋ฅผ ๋ฟ๊ณ ์์๋ค. ์ด์ํ๋ ์ฌ์ดํธ์ ํ์คํ ๋ฆฌ๊ฐ ์์ด์ trackClicksEx๋ฅผ ์ญ์ ํ์ง ์๊ณ ๋น function(){} ์ผ๋ก return
// ๋น ๊ฐ์ฒด์ ํ์
๊ฐ๋(TypeError ๋ฐฉ์ง ์คํฌ๋ฆฝํธ)
// @๋์: s, trackClicksEx
(function(window) {
var REQUIRED_GLOBAL_VARS = {
s: 'object',
trackClicksEx: 'function'
};
var k, v;
for (k in REQUIRED_GLOBAL_VARS) {
v = REQUIRED_GLOBAL_VARS[k];
fillBlankObject(k, v);
}
// window ๋ค์์คํ์ด์ค์์ ์ฃผ์ด์ง `key`์ ๋ํ ๊ฐ์ด ์ ์๋์ง ์์์ ๊ฒฝ์ฐ
// `type`์ ๋ง๊ฒ ๋น ๊ฐ์ฒด ๋๋ ํจ์๋ฅผ ์์ฑํฉ๋๋ค.
// @param {string} key -- ํด๋น ์ ์ญ ๋ณ์์ ์ด๋ฆ
// @param {string} type -- ํด๋น ์ ์ญ ๋ณ์์ ํ์
(๊ธฐ๋ณธ๊ฐ: 'object')
function fillBlankObject(key, type) {
type = type || 'object';
// key๊ฐ ์ฃผ์ด์ง์ง ์์ ๊ฒฝ์ฐ ์คํต
if (!key) {
return;
}
// ํ์ํ ์ ์ญ ๋ณ์๊ฐ ์ ์๋์ด ์์ง ์์ผ๋ฉด
if (typeof window[key] === 'undefined') {
window[key] = createEmptyTemp(type);
}
}
function createEmptyTemp(type) {
type = type.toLowerCase();
switch (type) {
case 'function':
return function() {};
break;
case 'array':
return [];
break;
case 'object':
return {};
break;
case 'string':
return '';
break;
case 'number':
return 0;
break;
default:
return {};
break;
}
}
})(window);
// ํ์ํ ์ ์ญ ๋ณ์๊ฐ ์ ์๋์ด ์์ง ์์ผ๋ฉด
if (typeof window[key] === 'undefined') {
window[key] = createEmptyTemp(type);
}
typeof๋ฅผ ์ด ์ด์ ๋..
var foo;
if (foo === undefined) alert();
์ด๋ ๊ฒ ์ธ ๊ฒฝ์ฐ ๋ณ๋ค๋ฅธ ๋ฌธ์ ๋ ์๋ค. ํ์ง๋ง
var foo;
if (bar === undefined) alert();
// ์๋น
์๋ฌ
// ReferenceError: bar is not defined