javascript - 실제 개발에서 클로저를 사용하는 방법은 무엇입니까?
PHPz
PHPz 2017-05-16 13:35:00
0
9
969

영상에서 클로저 기능에 대한 설명을 본 후에도 여전히 이해가 되지 않습니다. 예를 들어 스크린샷의 코드는 cmp 함수에 passline 매개변수를 추가하면 구현할 수 있습니다. .

폐쇄의 역할을 더 잘 설명할 수 있는 사람은 누구인가요?

PHPz
PHPz

学习是最好的投资!

모든 응답(9)
过去多啦不再A梦

지역 변수의 수명 주기를 연장하고 개인 변수를 캡슐화합니다

으아아아
伊谢尔伦

변수 저장은 변수 오염을 피하기 위해 전역 변수를 대체하는 데 주로 사용됩니다.

巴扎黑

클로저로 해결되는 문제: JSJS词法作用域规则,其访问是一直向上查找作用域,直到全局作用域。而想直接访问某个作用域可通过闭包解决。

function foo(){
var a = 1;
function bar(){
    console.log(a);
}
return bar;
}
var baz = foo();
baz();

bar词法作用域可以访问foo内部作用域,foo执行后返回bar,最后赋值给baz,可以获取并访问foo内部作用域,只是标识符不同而已。
该代码就使用了闭包,可以说写JS代码处处可见闭包,使用闭包还有一个好处就是引用的作用域不会被垃圾回收处理,当然不合理的使用会耗内存

闭包用来增加变量(能访问某作用域,自然能加变量)或者延长其生命周期(作用域被引用,自然会延长)

for (var i = 0; i < 5; i++){
    setTimeout(function(){
    console.log(i)},i * 1000)
}    

for (var i = 0; i < 5; i++){
    (function (i) {
    setTimeout(function(){
    console.log(i)},i * 1000)
    })(i)    
}

第一个循环是声明了几个函数,共享全局i变量(变量和函数声明都提升了)。
第二个循环是定义了几个立即执行函数,又传递了i值,故每个i어휘적 범위 규칙
에 따라 해당 액세스는

전역 범위

까지 위쪽으로 범위를 검색하는 것입니다. 특정 범위에 직접 액세스하려면 클로저를 사용할 수 있습니다. 으아악 bar 어휘 범위는 foo의 내부 범위에 액세스할 수 있습니다. foo가 실행된 후 bar를 반환하고 마지막으로 baz에 할당하면 foo의 내부 범위를 얻고 액세스할 수 있지만 식별자는 다릅니다.

이 코드는 클로저를 사용합니다. JS 코드를 작성할 때 클로저를 사용할 때의 또 다른 이점은 참조된 범위가 가비지 수집되지 않는다는 것입니다. 그것을 사용하면 메모리

가 소모됩니다. 클로저는

변수 추가🎜(특정 범위에 액세스할 수 있으면 자연스럽게 변수를 추가할 수 있음) 또는 🎜 수명주기 연장🎜(범위가 참조되면 자연스럽게 확장됨) 🎜에 사용됩니다. 으아악 🎜첫 번째 루프는 여러 함수를 선언하고 전역 i 변수를 공유합니다(변수 및 함수 선언 모두 승격됩니다). 🎜두 번째 루프는 여러 가지 즉시 실행 함수를 정의하고 i 값을 전달하므로 각 i 값에는 자체 범위가 있습니다. 🎜이것은 클로저 + 루프의 더 나은 예이지만 이것은 특별합니다. 클로저는 자체 범위에 액세스합니다. 🎜 🎜🎜물론 클로저 개념을 가장 잘 구현한 모듈은 범위를 효과적으로 도입하는 메서드를 반환하는 모듈입니다. 🎜🎜 🎜🎜 폐쇄: 외부에서 또는 자체적으로 액세스할 수 있는 특정 범위를 획득하고 액세스하는 방법입니다. 🎜🎜
Ty80

가장 큰 두 가지 기능

  1. 함수 내부 변수 읽기

  2. 항상 변수값을 메모리에 유지

첫 번째에 대해서는 자세히 설명하지 않지만 두 번째 예시를 살펴보세요

으아악

결과는 실제로 클로저 f2 함수입니다. 두 번 실행했는데, 처음에는 값이 999였고, 두 번째에는 값이 1000이었습니다. 이는 함수 f1의 지역 변수 n이 항상 메모리에 저장되며 f1이 호출된 후에 자동으로 지워지지 않음을 증명합니다.
왜 이런 일이 일어나는 걸까요? 그 이유는 f1이 f2의 상위 함수이고 f2가 전역 변수에 할당되어 f2가 항상 메모리에 있고 f2의 존재가 f1에 따라 달라지므로 f1은 항상 메모리에 있고 삭제되지 않기 때문입니다. 호출이 완료된 후 가비지 수집 메커니즘(가비지 수집)에 의해 재활용됩니다.
이 코드에서 주목할 만한 또 다른 점은 "nAdd=function(){n+=1}" 줄입니다. 우선 nAdd 이전에는 var 키워드가 사용되지 않으므로 nAdd는 로컬 변수가 아닌 전역 변수입니다. 둘째, nAdd의 값은 익명 함수이고 이 익명 함수 자체도 클로저이므로 nAdd는 함수 외부에서 함수 내부의 지역 변수에 대해 연산을 수행할 수 있는 setter와 동일합니다

  • 프라이빗 변수와 프라이빗 메소드를 관리하고 안전한 환경에서 변수(상태)에 대한 변경 사항을 캡슐화합니다

  • 코드를 클로저 형태로 캡슐화하고 커링, 디커링 구현 등 때가 되면 사용될 때까지 기다립니다

  • 주의사항:

    • 클로저의 일부 리소스는 자동으로 해제될 수 없기 때문에 메모리 누수가 발생하기 쉽습니다. 해결 방법은 함수를 종료하기 전에 사용하지 않는 지역 변수를 모두 삭제하는 것입니다.

    • 클로저는 상위 함수 외부의 상위 함수 내부 변수 값을 변경합니다. 따라서 부모 함수를 객체로, 클로저를 퍼블릭 메소드로, 내부 변수를 프라이빗 값으로 사용하는 경우 부모 함수 내부에서 변수 값을 임의로 변경하지 않도록 주의해야 합니다.

世界只因有你

set_passLine 은 실제로 두 매개변수의 함수라고 하면 받아들일 수 있나요?

으아악

이 합계 함수

으아악

는 기능적으로 동일하지만 전자는 모든 매개변수를 사용하여 한 번에 호출할 필요가 없습니다.

또한 첫 번째 작성 방법은 클래스와 동일한 기능을 달성할 수 있습니다.

으아악

동일한 기능을 다르게 구현한 것일지라도. 그러나 사람들은 함수형 프로그래밍이 다른 방법보다 낫다는 사실을 점차 깨닫고 있습니다. 더 좋다는 것은 코드 크기 측면에서 더 좋고 더 명확하다는 것을 의미합니다(그러나 프로그래머에 대한 요구 사항은 점점 더 높아지고 있습니다).

링크를 주세요. 저는 js로 작성했습니다: http://zonxin.github.io/post/...

P.S.
객체 지향 프로그래밍은 모든 "객체"를 객체로 간주하는 것입니다. 프로그래밍은 객체를 사용하여 "객체"의 동작, 즉 특정 "세계"의 작동을 시뮬레이션하는 것입니다.
함수형 프로그래밍은 프로세스를 고려하지 않고 "객체"의 초기 상태와 함수를 거친 후의 "객체"의 최종 상태에만 관심이 있습니다.

滿天的星座

저는 항상 내부 변수를 보호하고 노출된 API를 통해 작동한다는 식으로 이해해 왔습니다.

으아악

위 내용은 개인적인 이해입니다

Ty80

가변 오염을 피하세요. 하지만 ES6에서는 let과 const를 사용하여 이 문제를 해결하세요

大家讲道理

초등 수준에서
알고 있는 것은 1. 지역 변수에 접근할 수 있다는 것
2. 항상 메모리에 저장될 수 있다는 것입니다

메모리 누수가 발생할 수 있으므로 사용 빈도가 너무 높으면 안 됩니다

PHPzhong

나에게 인상 깊었던 내용에 답해 주세요 偏函数

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿