이런 원리에 근거도 없는 맹목적인 연구와 테스트가 나를 혼란스럽게 만들었습니다. 사실 원리를 이해하면 그럴 필요가 없나요? 많은 테스트를 하나씩 수행한 다음 규칙을 그립니다.
var의 규칙은 다음과 같습니다. var를 사용하여 선언된 변수는 내부 변수입니다. 그렇지 않으면 어떻게 해서든 전역 변수가 먼저 호출됩니다.
이에 대한 규칙은 다음과 같습니다. 메소드 함수의 this는 항상 자신을 가리키고 일반 함수의 this는 항상 DOMWindow를 가리킵니다.
// GodDamnTest1 function Foo() { var a = 123; // 局部变量, 所有子函数的全局变量 this.a = 456; // 对象属性 (function() { alert(a); // 123, 全局 alert(this.a); // undefined, 普通函数, this指向DOMWindow })(); } var f = new Foo(); // GodDamnTest2 function Foo() { var a = 123; this.a = 456; (function(a) { // 局部声明 alert(a); // 456, 被函数局部声明的a覆盖了全局 })(this.a); } var f = new Foo(); // GodDamnTest3 function Foo() { var a = 123; this.a = 456; (function() { alert(a); // 123, 全局 alert(this.a); // undefined, DOMWindow this.b = 789; // window.b = 789 })(); (function() { alert(this.b); // 789, window.b })(); } var f = new Foo(); (function() { alert(this.b); // 789, window.b })(); // GodDamnTest4 function Foo() { (function() { this.b = 789; // window.b = 789 })(); (function() { alert(this.b); // 789, window.b var b = 0; alert(b); // 0, 这样的测试也写出来了! })(); } var f = new Foo(); (function() { alert(this.b); // 789, window.b alert(b); // 789, window.b })();
놀랍게도 마지막 알림(b) 결과는 여전히 789입니다. // 전혀 놀랍지 않습니다!
// GodDamnTest5 function Foo() { (function() { this.b = 789; // window.b = 789 })(); (function() { alert(this.b); // 789, window.b alert(b); // undefined, 全局 var b = 0; alert(b); // 0, 还有这种测试! })(); } var f = new Foo(); (function() { alert(this.b); // 789, window.b alert(b); // 789, window.b })();
PS: 지역 변수를 삭제하는 JS 메서드
alert('value:'+str+'\ttype:'+typeof(str)) //声明变量前,引用 var str="dd"; alert('value:'+str+'\ttype:'+typeof(str)) //声明并赋值变量后,引用 str=undefined; //删除局部变量 alert('value:'+str+'\ttype:'+typeof(str)) //取消变量后,引用,和第一个相同
위 내용은 JS 전역 변수 및 지역 변수 구문 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!