함수 표현식과 함수 성명
함수 표현식과 함수 성명
ECMAScript에서 함수를 만드는 데 가장 자주 사용하는 두 가지 방법은 함수 표현식과 함수 성명이다. 이 두 가지 차이점은 약간 어지럽다. 왜냐하면 ECMA규범은 단지 한 가지만 명확하기 때문이다. 함수 성명은 반드시 표시자(Identifier)가 있어야 하고 함수 표현식은 이 표시자를 생략할 수 있다.
함수 선언:
function 함수 이름 (매개 변수: 선택 사항) {함수체}
함수 표현식:
varname=function 함수 이름 (선택 사항) (인자: 선택 사항) {함수체}
따라서 함수 명칭을 성명하지 않으면 표현식이 틀림없지만 함수 명칭을 성명하면 함수 성명인지 함수 표현식인지 어떻게 판단할 수 있을까?ECMAScript는 상하문을 통해 구분됩니다. 만약functionfoo() {}가 값 표현식의 일부분이라면 함수 표현식입니다. 만약functionfoo() {}가 함수 안에 포함되거나 프로그램의 맨 위에 있으면 함수 성명입니다. function foo(){} // ,
var bar = function foo(){}; // ,
new function bar(){}; // , new
(function(){
function bar(){} // ,
})();
그리고 함수 표현식은 흔히 볼 수 없는 것이 바로 괄호에 묶여 있는 (function foo () {}) 이다. 그가 표현식이라는 이유는 괄호 () 는 그룹 조작부호이기 때문이다. 그 안에 표현식만 포함할 수 있기 때문이다. 몇 가지 예를 살펴보자. function foo(){} //
(function foo(){}); // :
명명 함수 표현식
명명 함수 표현식을 언급하자면 당연히 이름이 있어야 한다. 앞의 예는 varbar=functionfoo(){};바로 유효한 명명 함수 표현식이지만 한 가지 기억해야 할 것은 이 이름은 새로 정의된 함수 작용역에서만 유효하다는 것이다. 왜냐하면 규범에 따라 표시자가 외곽의 작용역에서만 유효하지 않다고 규정했기 때문이다. var f = function foo(){
return typeof foo; // foo
};
// foo
console.log(typeof foo); // "undefined"
console.log(f()); // "function"
var f=functionfoo() {returnfoo;/foo는 내부 작용 영역에서 유효합니다};//foo는 외부에서 보이지 않는 콘솔에 사용됩니다.log(typeof foo);//"undefined" console.log( f()==f);//"function" console.log(f.name);//foo
var f=function g(){ return 23; } console.log( typeof g);//undefined console.log(g());//Uncaught ReferenceError: g is not defined console.log( g);//Uncaught ReferenceError: g is not defined console.log(f);//function g() console.log(f());//23 console.log(f.name);//g
마지막으로 보충하자면, 함수의 귀속은 일반적으로arguments를 사용한다.callee () 방법이지만 엄격한 모드에서 오류가 발생합니다. 이것은 명명 함수 표현식으로 같은 결과를 얻을 수 있습니다
arguments를 사용하다.callee(): var sum = function(n){
if (n <= 1) return 1;
else return n+arguments.callee(n - 1)
}
var sum1=sum; //sum1 sum
sum=function(){
return 0;
}
console.log(sum1(5));//15
console.log(sum(5));//0 sum
:
var f = function foo(m){ if(m<=1){ return 1;}else {return m*foo(m-1)}//foo는 내부 작용역 내에서 유효합니다. 여기는 m*f(m-1)}를 사용할 수 있습니다. console.log(f(4));//foo는 외부에서 사용할 수 없기 때문에 f() 만 사용할 수 있습니다
기왕 이렇게 요구하는 바에야 함수 표현식을 명명하면 도대체 무슨 소용이 있겠는가?왜 이름을 지어야 합니까?
우리가 처음에 말한 바와 같이 그 이름을 주는 것은 디버깅 과정을 더욱 편리하게 할 수 있기 때문이다. 디버깅을 할 때 호출 창고의 모든 항목에 자신의 이름이 있으면 디버깅 과정은 너무 시원하고 느낌이 다르기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
function foo(){} // ,
var bar = function foo(){}; // ,
new function bar(){}; // , new
(function(){
function bar(){} // ,
})();
function foo(){} //
(function foo(){}); // :
명명 함수 표현식을 언급하자면 당연히 이름이 있어야 한다. 앞의 예는 varbar=functionfoo(){};바로 유효한 명명 함수 표현식이지만 한 가지 기억해야 할 것은 이 이름은 새로 정의된 함수 작용역에서만 유효하다는 것이다. 왜냐하면 규범에 따라 표시자가 외곽의 작용역에서만 유효하지 않다고 규정했기 때문이다.
var f = function foo(){
return typeof foo; // foo
};
// foo
console.log(typeof foo); // "undefined"
console.log(f()); // "function"
var f=functionfoo() {returnfoo;/foo는 내부 작용 영역에서 유효합니다};//foo는 외부에서 보이지 않는 콘솔에 사용됩니다.log(typeof foo);//"undefined" console.log( f()==f);//"function" console.log(f.name);//foo
var f=function g(){ return 23; } console.log( typeof g);//undefined console.log(g());//Uncaught ReferenceError: g is not defined console.log( g);//Uncaught ReferenceError: g is not defined console.log(f);//function g() console.log(f());//23 console.log(f.name);//g
마지막으로 보충하자면, 함수의 귀속은 일반적으로arguments를 사용한다.callee () 방법이지만 엄격한 모드에서 오류가 발생합니다. 이것은 명명 함수 표현식으로 같은 결과를 얻을 수 있습니다
arguments를 사용하다.callee():
var sum = function(n){
if (n <= 1) return 1;
else return n+arguments.callee(n - 1)
}
var sum1=sum; //sum1 sum
sum=function(){
return 0;
}
console.log(sum1(5));//15
console.log(sum(5));//0 sum
:
var f = function foo(m){ if(m<=1){ return 1;}else {return m*foo(m-1)}//foo는 내부 작용역 내에서 유효합니다. 여기는 m*f(m-1)}를 사용할 수 있습니다. console.log(f(4));//foo는 외부에서 사용할 수 없기 때문에 f() 만 사용할 수 있습니다
기왕 이렇게 요구하는 바에야 함수 표현식을 명명하면 도대체 무슨 소용이 있겠는가?왜 이름을 지어야 합니까?
우리가 처음에 말한 바와 같이 그 이름을 주는 것은 디버깅 과정을 더욱 편리하게 할 수 있기 때문이다. 디버깅을 할 때 호출 창고의 모든 항목에 자신의 이름이 있으면 디버깅 과정은 너무 시원하고 느낌이 다르기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.