1. 폐쇄 및 폐쇄의 글쓰기 및 사용법은 무엇입니까?
1. 폐쇄는 무엇입니까?
클로저, 폐쇄에 대한 공식적인 설명은 다음과 같습니다. 많은 변수와 이러한 변수에 묶인 환경이있는 표현식 (일반적으로 함수)이므로 이러한 변수는 표현식의 일부입니다. 클로저의 특징 :
1). 함수 변수에 대한 참조로서 함수가 반환 될 때 활성 상태에 있습니다.
2). 폐쇄는 함수가 반환 될 때 리소스가 해제되지 않는 스택 영역입니다.
간단히 말해서 JavaScript를 사용하면 내부 함수를 사용할 수 있습니다. 즉, 기능 정의 및 기능 표현은 다른 함수의 기능 본문에 있습니다. 또한 이러한 내부 함수는 존재하는 외부 함수에서 선언 된 모든 로컬 변수, 매개 변수 및 기타 내부 기능에 액세스 할 수 있습니다. 이러한 내부 함수 중 하나가 포함 된 외부 함수 외부에서 호출되면 폐쇄가 형성됩니다.
2. 클로저를 작성하고 사용하는 몇 가지 방법
우선, 우리는 JS에서 모든 것이 객체이며 함수는 객체의 한 유형이라는 것을 이해해야합니다. 먼저 클로저를 작성하는 5 가지 방법을 살펴보고 폐쇄가 무엇인지 간단히 이해해 봅시다. 자세한 설명은 나중에 제공됩니다.
// 첫 번째 쓰기 메소드 함수 circle (r) {this.r = r; } circle.pi = 3.14159; circle.prototype.area = function () {return circle.pi * this.r * this.r; } var c = 새로운 원 (1.0); 경고 (c.area ());이 글쓰기 방법은 특별한 것이 아니며 기능에 속성을 추가합니다.
// var circle = function ()을 쓰는 두 번째 방법 {var obj = new Object (); obj.pi = 3.14159; obj.area = function (r) {return this.pi * r * r; } return obj; } var c = 새로운 원 (); 경고 (c.area (1.0));이러한 글쓰기 방식은 변수를 선언하고 변수에 값으로 함수를 할당하는 것입니다.
// 작성의 세 번째 방법 var circle = new Object (); Circle.pi = 3.14159; circle.area = function (r) {return this.pi * r * r; } alert (circle.area (1.0));이 방법은 가장 잘 이해되는데, 이는 새로운 개체에 대한 다음 객체에 속성과 메소드를 추가하는 것입니다.
// var circle을 쓰는 네 번째 방법 = { "pi": 3.14159, "영역": function (r) {return this.pi * r * r; }}; 경고 (Circle.area (1.0));이 방법은 더 자주 사용되며 가장 편리합니다. var obj = {}는 빈 객체를 선언하는 것입니다.
// var circle을 쓰는 다섯 번째 방법 = 새 함수 ( "this.pi = 3.14159; this.area = function (r) {return r*r*this.pi;}"); 경고 ((new Circle ()). 면적 (1.0));솔직히 말해서, 나는이 글쓰기 방법을 사용한 적이 없으므로 당신은 그것을 참조 할 수 있습니다.
일반적으로 위의 방법은 두 번째와 네 번째에서 더 일반적이며 습관에 따라 선택할 수 있습니다.
JS에서 일반적으로 사용되는 프로토 타입은 위의 코드에 나타납니다. 그렇다면 프로토 타입의 사용은 무엇입니까? 아래를 살펴 보겠습니다.
var dom = function () {}; dom.show = function () {alert ( "show message"); }; dom.prototype.display = function () {alert ( "속성 메시지"); }; dom.display (); // 오류 dom.show (); var d = 새로운 dom (); D.Display (); d.show (); //오류JavaScript에서 각 함수에는 포르 타입 속성이 있고 객체는 그렇지 않기 때문에 먼저 변수를 선언하고 함수를 할당합니다. 두 가지 방법을 추가하고 위의 프로토 타입을 직접 추가하고 끊고 통화 상황을 확인하십시오. 분석 결과는 다음과 같습니다.
1. 프로토 타입 속성에 의해 정의 된 객체 메소드는 정적 메소드이며 클래스 이름으로 만 직접 호출 할 수 있습니다! 또한,이 변수는이 정적 방법에서는 객체의 다른 속성을 호출하는 데 사용할 수 없습니다!
2. 프로토 타입 속성을 사용하여 정의 된 객체 방법은 비 정적 메소드이며 인스턴스화 후에 만 사용할 수 있습니다! 이것은 메소드 내의 객체 자체의 다른 속성을 참조 할 수 있습니다!
다른 코드를 살펴 보겠습니다.
var dom = function () {var name = "default"; this.sex = "Boy"; this.success = function () {alert ( "success"); }; }; 경고 (dom.name); 경고 (dom.sex);먼저 살펴 보겠습니다. 무엇이 표시 될까요? 대답은 둘 다 정의되지 않은 것으로 표시되었다는 것입니다. JavaScript에서 각 함수는 범위를 형성하고 이러한 변수는 함수에서 선언 되므로이 함수의 범위에 있으며 외부에 액세스 할 수 없기 때문입니다. 변수에 액세스하려면 새로운 인스턴스가 있어야합니다.
var html = {name : 'object', success : function () {this.say = function () {alert ( "hello, world"); }; 경고 ( "OBJ 성공"); }};이 글쓰기 방법을 살펴 보겠습니다. 실제로 이것은 JavaScript의 "문법 설탕"입니다. 이 글쓰기 방법은 다음과 같습니다.
var html = new Object (); html.name = '개체'; html.success = function () {this.say = function () {alert ( "hello, world"); }; 경고 ( "OBJ 성공");변수 HTML은 기능이 아닌 객체이므로 프로토 타입 속성이 없으며 메소드는 모두 공개 메소드이며 HTML을 인스턴스화 할 수는 없습니다. 그렇지 않으면 다음 오류가 나타납니다.
그러나 var o = html과 같은 값으로 다른 변수에 할당 할 수 있습니다. 우리는 다음과 같이 사용할 수 있습니다.
경고 (html.name);
html.success ();
이것에 대해 말하면, 끝났습니까? 신중한 사람들이 성공 방법에서 Say 메소드에 액세스하는 방법을 물어볼 수 있습니까? html.success.say ()입니까?
물론. 위에서 언급했듯이 범위 제한으로 인해 액세스 할 수 없습니다. 따라서 다음 방법을 사용하여 액세스해야합니다.
var s = new html.success (); s.say (); // html.success.prototype.show = function ( "haha");}; var s = new Html.success (); s.show ();
JavaScript의 범위와 관련하여 한 문장으로 명확하게 설명 할 수 없습니다. 관심이 있으시면 온라인으로 정보를 찾을 수 있습니다.
2. 자바 스크립트 폐쇄의 목적
사실, 클로저를 사용함으로써 많은 일을 할 수 있습니다. 예를 들어, 객체 지향 코드 스타일을 시뮬레이션합니다. 더 우아하고 간결하게 코드를 표현하십시오. 일부 측면에서 코드 실행 효율성을 향상시킵니다.
1. 익명 자체 이행 기능
모든 변수가 VAR 키워드와 함께 추가되지 않으면 기본값이 글로벌 오브젝트의 속성에 추가됩니다. 이러한 임시 변수를 글로벌 객체에 추가하는 데는 많은 단점이 있습니다.
예를 들어 : 다른 기능은 이러한 변수를 오용 할 수 있습니다. 전역 객체가 너무 커지고 액세스 속도에 영향을 미치게합니다 (변수의 값이 프로토 타입 체인에서 통과해야하기 때문에).
변수를 사용할 때마다 VAR 키워드를 사용하는 것 외에도 종종 일부 기능을 한 번만 실행해야하며 UI의 초기화와 같이 내부 변수를 유지할 필요가 없으므로 클로저를 사용할 수 있습니다.
var data = {table : [], tree : {}}; (function (dm) {for (var i = 0; i <dm.table.rows; i ++) {var row = dm.table.rows [i]; for (var j = 0; j <row.cells; i ++) {drawcell (i, j);}}) (데이터);익명 기능을 만들고 즉시 실행합니다. 외부는 그 내부의 변수를 참조 할 수 없으므로 함수가 실행 된 직후 리소스가 릴리스됩니다. 열쇠는 글로벌 객체를 오염시키는 것이 아닙니다.
2. 결과 캐시
우리는 개발의 많은 상황을 만날 것입니다. 각 통화를 처리하는 데 시간이 오래 걸리는 시간이 많이 걸리는 기능 객체가 있다고 상상해보십시오.
그런 다음 계산 된 값을 저장해야합니다. 이 함수를 호출 할 때 먼저 캐시를 찾아 봅니다. 찾을 수없는 경우 계산 한 다음 캐시를 업데이트하고 값을 반환합니다. 발견되면 찾은 값을 직접 반환 할 수 있습니다. 클로저는 외부 참조를 해제하지 않기 때문에 정확히이를 수행하므로 함수 내부의 값을 보존 할 수 있습니다.
var cachedsearchbox = (function () {var cache = {}, count = []; return {att CACHE [FSB; COUNT.LENGHT> 100) {// CANT.SHIFT ()} CLEARSEARCHBOX; CachedSearchbox.attachsearchbox ( "입력");이런 식으로 두 번째 호출의 캐시에서 객체를 읽습니다.
3. 포장
var person = function () {// 변수의 범위는 함수 내부에 있으며 var 이름은 외부에 액세스 할 수 없습니다. var name = "기본값"; return {getName : function () {return name; }, setName : function (newName) {name = newName; }}} (); print (person.name); // 직접 액세스하면 결과는 정의되지 않은 print (person.getName ()); person.setname ( "Abruzzi"); print (person.getName ());결과는 다음과 같습니다.
한정되지 않은
기본
아브루지
4. 클래스와 상속을 구현합니다
함수 person () {var name = "default"; return {getName : function () {return name; }, setName : function (newName) {name = newName; }}}; var p = 새로운 사람 (); p.setName ( "tom"); 알림 (p.getName ()); var jack = function () {}; // person jack.prototype = new Person ()에서 상속되었습니다. // 개인 메소드 추가 jack.prototype.say = function () {alert ( "hello, 내 이름은 Jack입니다"); }; var j = 새로운 잭 (); j.setName ( "잭"); j.say (); 알림 (j.getName ());우리는 사람을 정의하고, 수업과 같으며, 새로운 사람 객체, 그 방법에 액세스합니다.
아래에서 우리는 Jack을 정의하고 사람을 물려 받고 우리 자신의 방법을 추가합니다.
개인 요약 :
나는 JavaScript가 스크립팅 언어 인 Java의 지점 일 뿐이며 배우기 쉬웠지만 이제는 배울 것이 많다는 것을 알았습니다. JavaScript는 우리가 생각했던 것보다 훨씬 강력합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.