자 바스 크 립 트 역할 영역 과 패키지 닫 기
10024 단어 JavaScript역할 영역폐쇄 하 다
우 리 는 먼저 역할 영역 부터 시작한다.
역할 영역
JavaScript 의 역할 영역 은 어떤 변 수 를 방문 할 수 있 는 지 제한 합 니 다.두 가지 작용 역 이 있 는데 그것 이 바로 전역 작용 역,국부 작용 역 이다.
전역 적 역할 영역
모든 함수 성명 이나 대괄호 밖에서 정 의 된 변 수 는 전역 작용 역 에 있 습 니 다.
하지만 이 규칙 은 브 라 우 저 에서 실행 되 는 자바 스 크 립 트 에서 만 유효 합 니 다.만약 당신 이 Node.js 에 있다 면 전체 역할 영역 에서 의 변 수 는 다 릅 니 다.그러나 이 글 은 Node.js 를 토론 하지 않 습 니 다.
`const globalVariable = 'some value'`
전체 변 수 를 설명 하면 함수 내 부 를 포함 한 모든 곳 에서 사용 할 수 있 습 니 다.
const hello = 'Hello CSS-Tricks Reader!'
function sayHello () {
console.log(hello)
}
console.log(hello) // 'Hello CSS-Tricks Reader!'
sayHello() // 'Hello CSS-Tricks Reader!'
비록 전역 역할 영역 에서 변 수 를 정의 할 수 있 지만,우 리 는 이렇게 하 는 것 을 추천 하지 않 습 니 다.이름 충돌 을 일 으 킬 수 있 기 때문에 두 개 이상 의 변 수 는 같은 변 수 를 사용 합 니 다.변 수 를 정의 할 때const
또는let
를 사용 하면 이름 이 충돌 할 때 오류 알림 을 받 을 수 있 습 니 다.이것 은 바람 직 하지 않다.
// Don't do this!
let thing = 'something'
let thing = 'something else' // Error, thing has already been declared
변 수 를 정의 할 때 사용 하 는 것 이var
이 라면 두 번 째 정 의 는 첫 번 째 정 의 를 덮어 씁 니 다.이것 도 코드 를 디 버 깅 하기 어렵 고 바람 직 하지 않다.
// Don't do this!
var thing = 'something'
var thing = 'something else' // perhaps somewhere totally different in your code
console.log(thing) // 'something else'
따라서 전역 변수 가 아 닌 부분 변 수 를 사용 해 야 합 니 다.국부 작용 역
코드 의 특정한 범위 에서 사용 하 는 변 수 는 부분 적 인 역할 영역 에서 정의 할 수 있 습 니 다.이것 이 바로 국부 변수 다.
JavaScript 에는 두 가지 부분 적 인 역할 영역 이 있 습 니 다.함수 역할 영역 과 블록 급 역할 영역 입 니 다.
우 리 는 함수 역할 영역 부터 시작한다.
함수 역할 영역
함수 에서 변 수 를 정의 할 때 함수 내 어느 곳 에서 든 사용 할 수 있 습 니 다.함수 외 에 너 는 그것 에 접근 할 수 없다.
예 를 들 어 아래 의 이 예 는
sayHello
함수 안의hello
변수 입 니 다.
function sayHello () {
const hello = 'Hello CSS-Tricks Reader!'
console.log(hello)
}
sayHello() // 'Hello CSS-Tricks Reader!'
console.log(hello) // Error, hello is not defined
블록 급 역할 영역대괄호 를 사용 할 때
const
또는let
변 수 를 설명 할 때 대괄호 내부 에서 만 이 변 수 를 사용 할 수 있 습 니 다.다음 예 에서
hello
는 대괄호 안에서 만 사용 할 수 있다.
{
const hello = 'Hello CSS-Tricks Reader!'
console.log(hello) // 'Hello CSS-Tricks Reader!'
}
console.log(hello) // Error, hello is not defined
블록 급 역할 도 메 인 은 함수 역할 도 메 인의 부분 집합 입 니 다.함 수 는 큰 괄호 로 정의 해 야 하기 때 문 입 니 다.(return 구문 과 화살표 함 수 를 명확 하 게 사용 하지 않 는 한)함수 향상 과 역할 영역
function 정 의 를 사용 할 때 이 함 수 는 현재 역할 영역의 맨 위로 향 상 됩 니 다.따라서 아래 의 코드 는 같은 효 과 를 가진다.
// This is the same as the one below
sayHello()
function sayHello () {
console.log('Hello CSS-Tricks Reader!')
}
// This is the same as the code above
function sayHello () {
console.log('Hello CSS-Tricks Reader!')
}
sayHello()
함수 표현 식 정 의 를 사용 할 때 함 수 는 변수 역할 영역의 맨 위로 올 라 가지 않 습 니 다.
sayHello() // Error, sayHello is not defined
const sayHello = function () {
console.log(aFunction)
}
여기에 두 개의 변수 가 있 기 때문에 함수 향상 은 혼란 을 초래 할 수 있 기 때문에 효력 이 발생 하지 않 습 니 다.그래서 반드시 함 수 를 사용 하기 전에 함 수 를 정의 해 야 한다.함수 가 다른 함수 의 역할 영역 에 접근 할 수 없습니다.
서로 다른 함 수 를 각각 정의 할 때 한 함수 에서 함 수 를 호출 할 수 있 지만 한 함수 가 다른 함수 의 역할 영역 내 부 를 방문 할 수 없습니다.
다음 예 는
second
이 변수 에 접근 할 수 없습니다firstFunctionVariable
.
function first () {
const firstFunctionVariable = `I'm part of first`
}
function second () {
first()
console.log(firstFunctionVariable) // Error, firstFunctionVariable is not defined
}
내장 작용 영역함수 내부 에서 함 수 를 정의 하면 내부 함 수 는 외부 함수 의 변 수 를 방문 할 수 있 지만 반대로 는 안 됩 니 다.이런 효 과 는 바로 어법 작용 역 이다.
외층 함 수 는 내부 함수 의 변 수 를 방문 할 수 없습니다.
function outerFunction () {
const outer = `I'm the outer function!`
function innerFunction() {
const inner = `I'm the inner function!`
console.log(outer) // I'm the outer function!
}
console.log(inner) // Error, inner is not defined
}
만약 작용 역 의 메커니즘 을 가시 화한 다 면,너 는 쌍방 향 거울(단면 투시 유리)이 있다 고 상상 할 수 있다.너 는 안에서 밖 을 볼 수 있 지만,밖 에 있 는 사람 은 너 를 볼 수 없다.함수 작용 역 은 마치 쌍방 향 거울 과 같다.너 는 안에서 밖 을 볼 수 있 지만 밖 에는 너 를 볼 수 없다.
포 함 된 역할 영역 도 비슷 한 메커니즘 으로 더 많은 양 방향 거울 이 있 는 것 과 같다.
다 층 함 수 는 여러 개의 양 방향 경 을 의미한다.
앞의 역할 영역 에 관 한 부분 을 이해 하면 폐쇄 가 무엇 인지 이해 할 수 있다.
폐쇄 하 다
한 함수 에 다른 함 수 를 새로 만 들 때 닫 힌 패 키 지 를 만 드 는 것 과 같 습 니 다.내부 함 수 는 폐쇄 입 니 다.일반적으로 외부 함수 의 내부 변 수 를 접근 할 수 있 도록 이 패 키 지 를 되 돌려 줍 니 다.
function outerFunction () {
const outer = `I see the outer variable!`
function innerFunction() {
console.log(outer)
}
return innerFunction
}
outerFunction()() // I see the outer variable!
내부 함 수 는 반환 값 이기 때문에 함수 성명 의 부분 을 간소화 할 수 있 습 니 다.
function outerFunction () {
const outer = `I see the outer variable!`
return function innerFunction() {
console.log(outer)
}
}
outerFunction()() // I see the outer variable!
패 킷 을 닫 으 면 외부 함수 의 변 수 를 방문 할 수 있 기 때문에 그들 은 보통 두 가지 용도 가 있 습 니 다.함수 가 값 을 되 돌 릴 때 어떤 조작 을 수행 할 때 보통 부작용 이 발생 합 니 다.부작용 은 많은 상황 에서 발생 합 니 다.예 를 들 어 Ajax 호출,시간 초과 처리 또는
console.log
의 출력 문 구 를 사용 하 더 라 도:
function (x) {
console.log('A console.log is a side effect!')
}
패 킷 을 닫 아 부작용 을 제어 할 때 실제 적 으로 코드 작업 절 차 를 헷 갈 릴 수 있 는 부분,예 를 들 어 Ajax 나 시간 초과 등 을 고려 해 야 합 니 다.일 을 분명하게 말 하려 면 예 를 보 는 것 이 비교적 편리 하 다.
예 를 들 어 너 는 너의 친 구 를 위해 생일 을 축하 하고 케이크 를 만들어 야 한다.이 케이크 를 만 드 는 데 1 초 걸 릴 수 있 기 때문에 당신 은 함 수 를 써 서 1 초 후에 케이크 를 다 만 드 는 것 을 기록 하 였 습 니 다.
코드 가 짧 고 읽 기 쉬 울 수 있 도록 ES6 의 화살표 함 수 를 사 용 했 습 니 다.
function makeCake() {
setTimeout(_ => console.log(`Made a cake`, 1000)
)
}
보시 다시 피 케이크 를 만 드 는 것 은 부작용 을 가 져 왔 습 니 다.한 번 의 지연 입 니 다.더 나 아가,예 를 들 어 당신 의 친구 가 케이크 의 맛 을 선택 할 수 있 도록 하고 싶다.그럼 케이크
makeCake
를 만 드 는 함수 에 인 자 를 추가 하 세 요.
function makeCake(flavor) {
setTimeout(_ => console.log(`Made a ${flavor} cake!`, 1000))
}
그래서 이 함 수 를 호출 할 때 1 초 후에 이 새로운 맛의 케이크 가 만들어 집 니 다.
makeCake('banana')
// Made a banana cake!
하지만 문 제 는 케이크 의 맛 을 당장 알 고 싶 지 않다 는 점 이다.너 는 시간 이 다 되 었 다 는 것 만 알 고 케이크 를 다 만 들 면 된다.이 문 제 를 해결 하려 면 케이크 의 맛 을 보존 하 는 기능
prepareCake
을 써 도 된다.그리고 내부 호출prepareCake
의 패 킷makeCake
을 되 돌려 줍 니 다.여기 서부 터 당신 이 필요 로 할 때 호출 할 수 있 고 케이크 도 1 초 후에 바로 만 들 수 있 습 니 다.
function prepareCake (flavor) {
return function () {
setTimeout(_ => console.log(`Made a ${flavor} cake!`, 1000))
}
}
const makeCakeLater = prepareCake('banana')
// And later in your code...
makeCakeLater()
// Made a banana cake!
이것 은 바로 패 킷 을 사용 하여 부작용 을 줄 이 는 것 이다.당신 이 움 직 이 는 내부 패 킷 을 만 들 수 있다.개인 변수 와 패키지
앞에서 말 했 듯 이 함수 내의 변 수 는 함수 외부 에서 접근 할 수 없습니다.접근 할 수 없 으 면 개인 변수 라 고 할 수 있 습 니 다.
그러나 때때로 개인 변 수 를 방문 해 야 할 때 가 있다.이 럴 때 는 폐쇄 적 인 도움 이 필요 하 다.
function secret (secretCode) {
return {
saySecretCode () {
console.log(secretCode)
}
}
}
const theSecret = secret('CSS Tricks is amazing')
theSecret.saySecretCode()
// 'CSS Tricks is amazing'
이 예 에서saySecretCode
함 수 는 원 함수 밖에서secretCode
이라는 변 수 를 드 러 냈 다.그래서 그것 도 특권 함수 가 되 었 다.개발 자 도구 디 버 깅 사용
Chrome 과 Firefox 의 개발 자 도 구 는 현재 역할 영역 에서 접근 할 수 있 는 여러 변 수 를 편리 하 게 디 버 깅 할 수 있 도록 해 줍 니 다.일반적으로 두 가지 방법 이 있 습 니 다.
첫 번 째 방법 은 코드 에서
debugger
키 워드 를 사용 하 는 것 이다.디 버 깅 을 위해 브 라 우 저 에서 실행 중인 자 바스 크 립 트 를 일시 정지 시 킬 수 있 습 니 다.다음은
prepareCake
의 예 이다.
function prepareCake (flavor) {
// Adding debugger
debugger
return function () {
setTimeout(_ => console.log(`Made a ${flavor} cake!`, 1000))
}
}
const makeCakeLater = prepareCake('banana')
Chrome 개발 자 도 구 를 열 고 Source 페이지(또는 Firefox 의 Debugger 페이지)로 이동 하면 접근 할 수 있 는 변 수 를 볼 수 있 습 니 다.debugger 디 버 깅
prepareCake
의 역할 영역 을 사용 합 니 다.너 도
debugger
키 워드 를 폐쇄 내부 에 두 어도 된다.대비 변수의 역할 영역:
function prepareCake (flavor) {
return function () {
// Adding debugger
debugger
setTimeout(_ => console.log(`Made a ${flavor} cake!`, 1000))
}
}
const makeCakeLater = prepareCake('banana')
디 버 깅 패 킷 내부 역할 영역
두 번 째 방식 은 코드 의 해당 위치 에 정지점 을 추가 하고 해당 하 는 줄 수 를 클릭 하면 된다.
정지점 디 버 깅 역할 영역 통과
총괄 하 다
폐쇄 와 역할 영역 은 그리 어렵 지 않다.일단 쌍방 향 렌즈 의 사 고 를 이용 하여 이해 하면 그것들 은 매우 간단 하 다.
함수 에서 변 수 를 설명 할 때 함수 내 에서 만 접근 할 수 있 습 니 다.이 변수의 역할 영역 은 함수 에 제한 되 어 있다.
만약 당신 이 한 함수 안에서 내부 함 수 를 또 정의 한다 면,이 내부 함 수 는 패키지 라 고 불 린 다.그것 은 여전히 외부 함수 의 역할 영역 에 접근 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.