함수는 모듈식 프로그래밍의 기초입니다. 복잡한 Ajax 애플리케이션을 작성하려면 함수에 대해 더 깊이 이해해야 합니다.
JavaScript의 함수는 다른 언어와 다릅니다. 각 함수는 객체로 유지되고 실행됩니다. 함수 객체의 속성을 통해 함수를 변수에 쉽게 할당하거나 함수를 매개변수로 전달할 수 있습니다. 계속하기 전에 함수 사용 구문을 살펴보겠습니다.
다음은 인용문입니다.
function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function();
이는 함수 선언에 대한 올바른 구문입니다. 다른 언어에서 흔히 사용하는 함수나 이전에 소개했던 함수 정의 방식과는 많이 다릅니다. 그렇다면 JavaScript에서는 왜 이렇게 작성할 수 있을까요? 따르는 구문은 무엇입니까? 자세한 내용은 아래에 설명되어 있습니다.
함수 객체 이해
function 키워드를 사용하여 함수를 정의하고, 각 함수에 함수명을 지정하고, 함수명을 통해 호출할 수 있습니다. JavaScript가 해석되고 실행될 때 함수는 도입되는 Function Object인 객체로 유지됩니다.
함수 객체는 다른 사용자 정의 객체와 본질적으로 다릅니다. 이러한 유형의 객체를 날짜 객체(Date), 배열 객체(Array), 문자열 객체(String All)라고 합니다. 내부 개체입니다. 이러한 내장 객체의 생성자는 JavaScript 자체에 의해 정의됩니다. 객체를 반환하기 위해 new Array()와 같은 문을 실행함으로써 JavaScript는 사용자가 객체 구성 방법을 지정하는 대신 반환된 객체를 초기화하는 내부 메커니즘을 갖습니다. .
JavaScript에서는 해당 유형의 함수 객체가 Function이고, 해당 유형의 배열 객체가 Array이고 해당 유형의 날짜 객체가 Date인 것처럼 new Function()을 통해 함수 객체를 생성할 수 있습니다. 또는 function 키워드를 통해 객체를 생성할 수 있습니다. 이해를 돕기 위해 함수 객체 생성과 배열 객체 생성을 비교합니다. 먼저 배열 개체를 살펴보겠습니다. 다음 두 줄의 코드는 모두 배열 개체 myArray를 생성합니다.
다음은 참조 조각입니다.
var myArray=[]; //等价于 var myArray=new Array();
마찬가지로 다음 두 줄의 코드도 create a function myFunction:
function myFunction(a,b){ return a+b; } //等价于 var myFunction=new Function("a","b","return a+b");
배열 객체 구문을 구성하는 구문과 비교해 보면, 앞서 소개한 함수 선언은 위 코드의 첫 번째 방식이고, 그 내부에는 함수 객체의 본질을 확실히 알 수 있습니다. 인터프리터에서 이 구문을 만나면 Function 개체가 자동으로 생성되고 함수가 내부 개체로 저장되고 실행됩니다. 여기서도 알 수 있듯이 함수객체명(함수변수)과 일반 변수명은 동일한 사양을 가지고 있으며 둘 다 변수명을 통해 변수를 참조할 수 있으나 함수변수명 뒤에는 괄호와 매개변수가 올 수 있다. 기능을 수행하기 위한 목록입니다.
함수 본문에는 일반적으로 여러 개의 명령문이 문자열 형식으로 매개변수로 전달되면 코드의 가독성이 떨어지기 때문에 new Function() 형식으로 함수를 생성하는 것은 일반적이지 않습니다. 가난할 것이다. 다음은 사용 구문에 대한 소개입니다.
다음은 인용 부분입니다.
var funcName=new Function(p1,p2,...,pn,body);
매개변수 유형은 모두 문자열이며, p1~pn은 생성된 함수의 매개변수 이름 목록을 나타냅니다. , body 는 생성된 함수 function body 문을 나타내며, funcName 은 생성된 함수의 이름입니다. 매개변수를 지정하지 않고 빈 함수를 생성할 수 있고, funcName을 지정하지 않고 이름 없는 함수를 생성할 수 있습니다. 물론 이러한 함수는 의미가 없습니다.
p1 ~ pn은 매개변수 이름 목록입니다. 즉, p1은 매개변수를 나타낼 수 있을 뿐만 아니라 쉼표로 구분된 매개변수 목록일 수도 있습니다. 예를 들어 다음 정의는 동일합니다. :
다음은 참조 부분입니다.
new Function("a", "b", "c", "return a+b+c") new Function("a, b, c", "return a+b+c") new Function("a,b", "c", "return a+b+c")
JavaScript에서는 Function 유형을 도입하고 new Function()과 같은 구문을 제공합니다. 왜냐하면 함수 개체는 속성과 메서드를 추가하기 위해 Function 유형을 사용해야 하기 때문입니다.
함수의 본질은 내부 개체이며 JavaScript 인터프리터가 함수의 작동 방식을 결정합니다. 위 코드로 생성된 함수는 프로그램 내 함수명을 이용하여 호출할 수 있습니다. 이 섹션의 시작 부분에 나열된 함수 정의 문제도 설명됩니다. 함수 선언 바로 뒤에 괄호를 추가하여 함수가 생성 직후에 호출된다는 것을 나타낼 수 있습니다. 예를 들면 다음과 같습니다.
다음은 참조 조각입니다.
var i=function (a,b){ return a+b; }(1,2); alert(i);
이 코드는 다음을 보여줍니다. 변수 i의 값은 3과 같습니다. i는 생성된 함수가 아니라 반환된 값을 나타냅니다. 괄호 "("가 등호 "="보다 우선순위가 높기 때문입니다. 이러한 코드는 일반적으로 사용되지 않을 수 있지만 사용자가 원하는 경우에 사용됩니다. 이는 모듈식에 적합한 솔루션입니다.
함수를 생성하는 다음 두 가지 방법은 동일하지만
다음은 인용 부분입니다.
function funcName(){ //函数体 } //等价于 var funcName=function(){ //函数体 }
그러나 전자의 방법은 명명된 함수를 생성하는 반면, 후자의 방법은 명명되지 않은 함수를 생성하고 변수가 명명되지 않은 함수를 가리키도록 만듭니다. 사용법에는 한 가지 차이점이 있습니다. 즉, 명명된 함수의 경우 함수를 정의할 수 있습니다. 이름이 지정되지 않은 함수의 경우 호출되기 전에 정의해야 합니다. 예:
다음은 인용 부분입니다.
<script language="JavaScript" type="text/javascript"> <!-- func(); var func=function(){ alert(1) } //--> </script>
이 단락 문은 func가 오류를 생성합니다. 정의되지 않았고:
다음은 인용문입니다:
<script language="JavaScript" type="text/javascript"> <!-- func(); function func(){ alert(1) } //--> </script>
则能够正确执行,下面的语句也能正确执行:
以下是引用片段:
<script language="JavaScript" type="text/javascript"> <!-- func(); var someFunc=function func(){ alert(1) } //--> </script>
由此可见,尽管JavaScript是一门解释型的语言,但它会在函数调用时,检查整个代码中是否存在相应的函数定义,这个函数名只有是通过function funcName()形式定义的才会有效,而不能是匿名函数。
函数对象和其他内部对象的关系
除了函数对象,还有很多内部对象,比如:Object、Array、Date、RegExp、Math、Error。这些名称实际上表示一个类型,可以通过new操作符返回一个对象。然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串“function”,而typeof一个数组对象或其他的对象时,它会返回字符串“object”。下面的代码示例了typeof不同类型的情况:
以下是引用片段:
alert(typeof(Function))); alert(typeof(new Function())); alert(typeof(Array)); alert(typeof(Object)); alert(typeof(new Array())); alert(typeof(new Date())); alert(typeof(new Object()));
运行这段代码可以发现:前面4条语句都会显示“function”,而后面3条语句则显示“object”,可见new一个function实际上是返回一个函数。这与其他的对象有很大的不同。其他的类型Array、Object等都会通过new操作符返回一个普通对象。尽管函数本身也是一个对象,但它与普通的对象还是有区别的,因为它同时也是对象构造器,也就是说,可以new一个函数来返回一个对象,这在前面已经介绍。所有typeof返回“function”的对象都是函数对象。也称这样的对象为构造器(constructor),因而,所有的构造器都是对象,但不是所有的对象都是构造器。
既然函数本身也是一个对象,它们的类型是function,联想到C++、Java等面向对象语言的类定义,可以猜测到Function类型的作用所在,那就是可以给函数对象本身定义一些方法和属性,借助于函数的prototype对象,可以很方便地修改和扩充Function类型的定义,例如下面扩展了函数类型Function,为其增加了method1方法,作用是弹出对话框显示"function":
以下是引用片段:
Functiothod1=function(){ alert("function"); } function func1(a,b,c){ return a+b+c; } func1.method1(); functhod1();
注意最后一个语句:funchotd1(),它调用了method1这个函数对象的method1方法。虽然看上去有点容易混淆,但仔细观察一下语法还是很明确的:这是一个递归的定义。因为method1本身也是一个函数,所以它同样具有函数对象的属性和方法,所有对Function类型的方法扩充都具有这样的递归性质。