자바스크립트에 정의된 일반적인 함수들 간의 차이점은 주로 다음 세 가지 측면을 통해 설명됩니다. 도움이 필요한 친구들이 참고할 수 있습니다
1: 키워드 함수를 호출하여
구성
예:
function distance(x1,x2,y1,y2) { var dx=x2-x1; var dy=y2-y1; return Math.sqrt(dx*dx+dy*dy); }
2: Function() 생성자 사용
예:
var f=new Function*"x","y","return x*y");
이 코드 줄은 익숙한 구문을 사용하여 정의된 함수와 본질적으로 동일한 새 함수를 생성합니다.
function f(x,y) { return x*y; }
Functino() 생성자는 문자열 매개변수를 원하는 만큼 받아들일 수 있습니다. 마지막 매개변수는 함수 본문으로, 세미콜론으로 구분된 모든 JavaScript 문을 포함할 수 있습니다. 기타 매개변수는 함수에서 정의할 형식 매개변수의 이름을 설명하는 데 사용되는 문자열입니다. 정의한 함수에 매개변수가 없으면 문자열(함수 본문)을 생성자에 전달하면 됩니다.
생성자 Function()에 전달된 매개변수 중 어느 것도 생성 중인 함수의 이름을 지정하지 않습니다. Function() 생성자로 생성된 이름 없는 함수를 "익명 함수"라고도 합니다.
Function() 생성자가 어떤 용도로 사용되는지 매우 궁금하실 수 있습니다. 왜 함수 명령문을 사용하여 모든 함수를 정의할 수 없나요? 그 이유는 Function() 생성자를 사용하면 함수 문의 미리 컴파일된 함수 본문으로 제한하지 않고 함수를 동적으로 빌드하고 컴파일할 수 있기 때문입니다. 이에 대한 부작용은 함수가 호출될 때마다 Function() 생성자가 이를 컴파일해야 한다는 것입니다. 따라서 루프 본문이나 자주 사용되는 함수에서 이 생성자를 자주 호출하면 안 됩니다.
Function() 생성자를 사용하는 또 다른 이유는 함수를 명령문으로 정의하는 대신 JavaScript 표현식의 일부로 정의할 수 있기 때문입니다.
3: 함수 리터럴
함수 리터럴은 익명 함수를 정의할 수 있는 표현식입니다. 함수 리터럴의 구문은 명령문이 아닌 표현식으로 사용된다는 점과 함수 이름을 지정할 필요가 없다는 점을 제외하면 함수 문의 구문과 매우 유사합니다. 다음 세 줄의 코드는 function() 문, Function() 생성자 및 함수 리터럴을 사용하여 기본적으로 동일한 세 가지 함수를 정의합니다.
function f(x){return x*x}; var f=new Function("x","return x*x;"); var f=function(x){reurn x*x};
함수 리터럴은 이름 없는 함수를 생성하지만 구문에서는 함수 이름을 지정할 수 있음도 지정합니다. 이는 자신을 호출하는 재귀 함수를 작성할 때 매우 유용합니다.
예:
var f=function fact(x){if(x<=1)return 1;else return x*fact(x-1);};
위 코드는 이름 없는 함수를 정의하고 해당 함수에 대한 참조를 변수 f에 저장합니다. 이는 실제로 사실()이라는 함수를 생성하지 않으며 단지 함수 본문이 이 이름으로 자신을 참조할 수 있도록 허용합니다. 그러나 이 명명된 함수 리터럴은 JavaScript 1.5 이전 버전에서는 올바르게 구현되지 않았습니다.
함수 리터럴의 사용법은 Function() 생성자를 사용하여 함수를 생성하는 방법과 매우 유사합니다. 명령문이 아닌 JavaScript 표현식으로 생성되므로 사용 방식이 더 유연하며, 특히 한 번만 사용되며 이름을 지정할 필요가 없는 함수의 경우 더욱 그렇습니다. 예를 들어, 함수 리터럴 표현식을 사용하여 지정된 함수는 변수에 저장되거나, 다른 함수에 전달되거나, 직접 호출될 수도 있습니다.
a[0]=function(x){return x*x;};//定义一个函数并保存它 a.sort(function(a,b){return a-b;});//定义一个函数;把它传递给另一个函数 var tensquared=(function(x){return x*x;})(10);
和Function()构造函数一样,函数直接量创建的是未命名函数,而且不会自动地将这个函数存储在属性中。但是,比起Function()构造函数来说,函数直接量有一个重要的优点。由Function()构造函数创建的函数的主体必须用一个字符串说明,用这种方式来表达一个长而复杂的函数是狠笨拙的。但是函数直接量的主体使用的却是标准的JavaScript语法。而且函数直接量只被解析一次,而作为字符串传递给Function()构造函数的JavaScript代码则在每次调用构造函数时只需被解析一次和编译一次。
在JavaScript1.1中,可以使用构造函数Function()来定义函数,在JavaScript1.2和其后的版本中,还可以使用函数直接量来构造函数。你应该注意这两种方法之间的重要差别。
首先,构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但是函数直接量却是函数结构的一个静态部分,就像function语句一样。
其次,作为第一个差别的必然结果,每次调用构造函数Function()时都会解析函数体并且创建一个新东汉数对象。如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率非常低。另一个方面,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象。
Function()构造函数和函数之间量之间的第三点差别是,使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被当作顶级函数来编译,就像下面代码所说明的那样:
var y="global"; function constructFunction() { var y="local"; return new Function("return y");//不捕捉局部作用域。 } //这行代码将显示"global",因为Function()构造函数返回的函数并不使用局部作用域。 //假如使用一个函数直接量,这行代码则可能显示"local"。 alert(constructFunction());