먼저 jQuery의 $.isWindow 함수를 살펴보겠습니다.
function isWin(obj){
return obj && typeof obj === 'object' && 'setInterval' in obj; 🎜>
함수 자체는 매우 과학적이며 주로 대상 객체에 setInterval 속성이 있는지 확인하여 판단합니다.
그러나 문제는 관례가 없으면 신뢰성이 없을 수 있다는 것입니다. , 예:
o[' setInterval']=true;
console.log( isWin(o) ); // true
위의 예는 다음과 같습니다. setInterval 속성을 개체 리터럴로 설정하면 사기가 성공합니다.
그러나 실제로 위에서는 null이 아닌 모든 개체를 배열과 같은 방식으로 위장할 수 있습니다.
arr[' setInterval']=true;
console.log( isWin(arr) ); // true
위의 속성 속성 확인에 비해 toString 함수를 사용하는 것이 더 적합합니다. 판단할 대상:
return Object.prototype.toString.call(obj)==='[object Window]'
}
위 함수는 표준 브라우저에서 잘 작동합니다. 하지만 새로운 호환성 문제도 발생합니다.
Object.prototype.toString.call(window)==='[ object Window]' // false
Object.prototype.toString.call(window)== ='[object Object]'; // true
// chrome
Object.prototype.toString.call (window)==='[object global]'; // true
// safari
Object.prototype.toString.call(window)==='[object DOMWindow]'; // true
물론, 주요 문제는 사악한 IE에서 비롯됩니다. 항상 IE의 초자연적인 사건을 생각나게 하는 경로:
console.log( window= =document ) // true
console.log( document==window ) / / false
쓰다보니 최종 해결책이 나온 것 같습니다.
return/Window| global/.test({}.toString.call(obj))||obj== obj.document&&obj.document!=obj
}