그러니 꺼내서 모두를 격려해 주세요.
먼저 다음 js 코드를 실행하세요
코드에 대한 설명은 다음과 같습니다.
foo.bar() // 인쇄 foo
//1. 경고는 toString 메서드를 암시적으로 호출하고 이를 문자열로 변환합니다. toString 메서드는 foo로 다시 작성되므로 foo
(foo.bar)();//입니다. print foo
//2 위의 실행은
(foo.bar || null)()
/*
3입니다. , Mozilla Firefox1.5.0.7과 Opera 9.0은 서로 다른 효과를 가지고 있습니다. Mozilla의 것은 foo입니다.
당분간은 ||의 JS 해석 방법에 대해 이야기하지 않겠습니다. bar 메소드가 적합합니다. 통과 후 | 🎜>
즉, 여기의 범위는 더 이상 foo 객체가 아니라 전역 범위입니다. 따라서 경고(this)는 경고(window)와 동일합니다.
객체
BTW: || 연산자는 두 표현식의 실행을 전역 범위 비교로 변환할 수 있습니다. IE 및 Opera(foo.bar || null)는 전역 참조를 반환합니다. 즉,
'bar': function () {
Alert(this);//여기서는 이미 Global this, global this입니다. , is window
},
자세한 내용은 기사 마지막 부분에
*/
bar = foo.bar();를 설명하는 코드를 추가하겠습니다. //반환되는 것은 "[object Window]"입니다.
/*4.
이것은 IE6.0, Mozilla Firefox1.5.0.7 및 Opera9.0의 동일한 객체입니다. 위의 실행에 대해 , 이 문장을 이해하는 것이 분명 더 쉽습니다
이유는 위와 동일합니다. 여기서 foo.bar의 참조는 전역 변수 bar에 제공되며 전역 변수는 모두 window의 참조에 종속됩니다. 다음 코드에서:
var a = 'never-online';
alert(this.a); //never-online
alert(window.a); //never-online
bar = foo.bar ; bar(); 다음 코드로 변경하면
foo.alert = foo.bar;
여기의 foo.alert는 여전히 foo 객체에 대한 참조이므로 foo 객체 This in은 여기에서 여전히 유효하며 bar 속성이 분명히 window이므로 window 객체가 되지 않았습니다.
foo.bar에 this가 있지만 this는 window로 참조됩니다.
*/
이 예를 다음과 같이 변경하면 다시 살펴보세요.
이유를 이해해야 합니다.