변수 n이 재설정되지 않는 이유는 무엇인가요?
으아악변수 n이 전역 변수임을 설명하세요. 변수 n이 f2에서 전역 변수로 승격되나요?
给我你的怀抱2017-05-18 10:52:47
js는 각 함수 호출에 대해 스택을 생성하므로 함수 내의 함수도 이 스택에 액세스할 수 있습니다.
먼저 var
를 추가하지 않았기 때문에 nAdd
를 호출할 수 있습니다. 이는 nAdd
를 전역 범위에서 정의하는 것과 동일합니다. 함수가 호출되는데, var
를 추가하고 이렇게 쓰면 오류가 발생합니다. nAdd
,是因为你没加var
,等于是在函数调用时定义了一个全局作用域下的nAdd
,你加上var
再这么写会报错。
你的var result=f1();
调用了函数f1
,也就创建了一个栈,保存了n=999
,并返回了f2
。之后你再怎么调用result()
,其实都是在调用同一个f2
,而这个f2
引用的外部栈,自然还是第一次调用f1
时候创建的那个。同样的nAdd
var result=f1();
은 스택을 생성하고 n=999
를 저장하고 를 반환하는 f1
함수를 호출합니다. f2
. 그 이후에 result()
를 어떻게 호출하든 실제로는 동일한 f2
를 호출하는 것이며, 이 f2
가 참조하는 외부 스택은 당연히 세 번째는 f1
이 한 번 호출되었을 때 생성되는 것입니다. 동일한 nAdd
는 전역적으로 작동하지만 동일한 스택의 데이터에도 액세스합니다. 그래서 nAdd가 전역 변수이기 때문에 n이 전역 변수로 승격되는 것이 아니라, nAdd가 가리키는 함수와 반환하는 클로저가 기본적으로 동일한 데이터에 액세스한다는 것입니다.
다음으로 다시 작성해 보세요. 🎜 으아악
我想大声告诉你2017-05-18 10:52:47
이 코드에서 결과는 실제로 클로저 f2 함수입니다. 두 번 실행했는데, 처음에는 값이 999였고, 두 번째에는 값이 1000이었습니다. 이는 함수 f1의 지역 변수 n이 항상 메모리에 저장되며 f1이 호출된 후에 자동으로 지워지지 않음을 증명합니다.
왜 이런 일이 일어나는 걸까요? 그 이유는 f1이 f2의 상위 함수이고 f2가 전역 변수에 할당되어 f2가 항상 메모리에 있고 f2의 존재가 f1에 따라 달라지므로 f1은 항상 메모리에 있고 삭제되지 않기 때문입니다. 호출이 완료된 후 가비지 수집 메커니즘(가비지 수집)에 의해 재활용됩니다.
이 코드에서 주목할 만한 또 다른 점은 "nAdd=function(){n+=1}" 줄입니다. 우선 nAdd 이전에는 var 키워드가 사용되지 않으므로 nAdd는 로컬 변수가 아닌 전역 변수입니다. 둘째, nAdd의 값은 익명 함수이고 익명 함수 자체도 클로저이므로 nAdd는 함수 외부에서 함수 내부의 지역 변수에 대해 연산을 수행할 수 있는 setter와 동일합니다.
http://www.ruanyifeng.com/blo...
ringa_lee2017-05-18 10:52:47
아님 n
被提升为全局变量了,这就是闭包。。。。
是nAdd
是全局变量。nAdd
和result
中涉及的n
都是 var n = 999
那个n
,而没有全局的n
http://zonxin.github.io/post/...
仅有的幸福2017-05-18 10:52:47
var nAdd = ... 다시 시도해 보면 그 이유를 알게 될 것입니다
var 선언이 없으면 전역 변수로 승격됩니다.
n변수는 전역변수가 아닙니다. 이렇게만 쓰면 n의 메모리가 해제되는 것을 방지할 수 있습니다
给我你的怀抱2017-05-18 10:52:47
f2 함수에는 f1 함수의 지역 변수 n에 대한 지속적인 참조가 있으며, f2가 반환된 후에는 n이 해제되지 않으며, 전역 함수인 nAdd는 물론 n에 대해 작동할 수 있습니다.
ringa_lee2017-05-18 10:52:47
n은 여전히 지역 변수입니다. 지역 변수 n의 연산은 항상 f1 함수에서 수행되기 때문입니다. nAdd()는 전역 함수로 실행되면 해당 범위의 n이 1씩 증가합니다
阿神2017-05-18 10:52:47
var result=f1(); 호출되면 내부 함수 f2가 반환되고 가비지 수집 메커니즘으로 인해 f1이 완료되면 외부 함수의 변수 n이 참조됩니다. n은 재활용되지 않았습니다. result()가 두 번째로 실행되면 n은 1000
n전역 변수를 추가하면 변수가 추가되지 않으므로 전역 범위입니다.
n은 지역 변수입니다
黄舟2017-05-18 10:52:47
var result=f1()
: f1 함수는 f2 함수를 반환합니다.
반환된 f2 함수를 결과 전역 변수 var result=f1()
:f1函数返回了f2函数
把返回的f2函数赋值给result全局变量,(f2的作用域链保存到result全局变量中)
result()
:调用result(),这就形成闭包:有权访问另外一个函数作用域中的变量
因为在f2中的作用域引用了f1中的n这个局部变量,当f1执行完毕后,垃圾回收机制发现n变量还在被result中引用所以垃圾回收机制不会把n回收释放。
以至于n一直保存在result作用域链中。result的作用域链正常能访问f1中的局部变量n,形成闭包。
nAdd()
:nAdd没有写var所以nAdd是全局变量,在调用nAdd()和result()是一样的都会形成闭包,匿名函数function(){n+=1}的作用域链中有n这个局部变量,所以当nAdd=funtion(){n+=1}时,这个匿名函数的作用域链保存到了全局变量nAdd形成闭包,调用nAdd()作用域链中找到f1局部变量n=999,n+1=1000。
result()
에 할당합니다(f2의 범위 체인은 결과 전역 변수에 저장됩니다). 변수)
result()
: 클로저를 형성하는 result() 호출: 다른 함수 범위의 변수에 액세스할 수 있는 권한이 있습니다.
nAdd()
: nAdd는 var를 작성하지 않으므로 nAdd는 전역 변수입니다. nAdd() 및 result() 호출은 동일하며 익명 함수 function(){을 형성합니다. n+=1} 범위 체인에 지역 변수 n이 있으므로 nAdd=function(){n+=1}일 때 이 익명 함수의 범위 체인은 전역 변수 nAdd에 저장되어 클로저를 형성합니다. nAdd() f1 지역 변수 n=999, n+1=1000을 호출하여 범위 체인에 추가합니다. 🎜🎜
🎜🎜result()
: result()는 1000🎜🎜을 출력합니다.
🎜
🎜🎜이건 그냥 제 이해입니다. 틀린 부분이 있으면 알려주세요🎜🎜PHP中文网2017-05-18 10:52:47
n은 전역 변수가 아니며 클로저입니다. n이 변경되는 이유는 nAdd 앞에 var를 쓰지 않았고 기본값이 전역이지만 함수가 클로저에 정의되어 있고 범위 등이 모두 내부에 있기 때문입니다.