함수 내부 속성, 함수 속성과 방법

8762 단어 함수.

함수 내부 속성


함수 내부에는 두 개의 특수한 대상이 있는데 그것이 바로arguments와this이다.1.arguments는 클래스 그룹의 대상으로 함수에 전송된 모든 매개 변수를 포함한다.arguments의 주요 용도는 함수 파라미터를 저장하는 것이지만 이 대상에는callee라는 속성이 하나 더 있다. 이 속성은 바늘로 이arguments 대상을 가진 함수를 가리킨다.아래의 이 매우 고전적인 곱셈 함수를 보십시오.
function factorial(num) {
    if(num <= 1) {
        return 1;
    } else {
        return num * factorial(num - 1);
    }
}
// , , , 。 factorial 。 , arguments.callee。
function factorial(num) {
    if(num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    }
}
// factorial() , factorial。 , 。

예를 들면 다음과 같습니다.
var trueFactorial = factorial;
factorial = function() {
    return 0;
};
alert(trueFactorial(5));   //120
factorial(5);   //0

2. 함수 내부의 또 다른 특수 대상은this이다.this는 함수가 실행되는 환경 대상을 인용하거나 this값이라고 할 수 있다. (웹 페이지의 전역 역할 영역에서 함수를 호출할 때,this 대상이 인용하는 것은 window이다.)
window.color = "red";
var o = {color: "blue"};

function sayColor() {
    alert(this.color);
}

sayColor();   //"red"this window。

o.oColor = sayColor;
o.oColor();   //"blue"  o, this o。

함수의 이름은 바늘을 포함하는 변수일 뿐이라는 것을 명심해라
다른 함수 대상의 속성:caller.이 속성은 현재 함수를 호출하는 함수의 인용을 저장합니다. 전역 역할 영역에서 현재 함수를 호출하면 그 값은null입니다.예를 들면 다음과 같습니다.
function outer() {
    inner();
}
function inner() {
    alert(inner.caller);
}
outer();

위 코드는 경고 상자에 outer () 함수의 원본 코드를 표시합니다.더욱 느슨한 결합을 실현하기 위해arguments를 통해서도 가능하다.callee.caller가 같은 정보를 방문합니다.
function outer() {
    inner();
}
function inner() {
    alert(arguments.callee.caller);
}
outer();

함수 속성 및 방법


ECMAScript의 함수도 객체이며 속성과 메서드가 있습니다.모든 함수는 두 개의 속성을 포함합니다:length와prototype.
1. length는 수신하고자 하는 이름 매개 변수의 개수를 나타낸다.
2. ECMAScript 핵심에 정의된 모든 속성 중 가장 깊이 새겨볼 수 있는 것은prototype 속성이다.ECMAScript의 인용 형식에 있어prototype은 모든 실례를 저장하는 방법의 진정한 존재입니다.다시 말하면 toString () 과value Of () 같은 방법은prototype 이름으로 저장되어 각자의 대상을 통해 실례적으로 접근할 뿐이다.사용자 정의 인용 형식을 만들고 계승을 실현할 때prototype 속성의 역할은 매우 중요하다.ECMAScript에서 prototype 속성은 일일이 열거할 수 없기 때문에 for-in을 사용하면 발견할 수 없습니다.
3. 모든 함수는 두 가지 계승되지 않은 방법을 포함한다. 그것이 바로 apply()와call()이다.이 두 가지 방법의 용도는 모두 특정한 작용역에서 함수를 호출하는 것이고 실제로는 함수 체내의this 대상의 값을 설정하는 것과 같다.
우선,apply() 방법은 두 개의 매개 변수를 수신한다. 하나는 그 중에서 함수를 실행하는 작용역이고, 다른 하나는 매개 변수 그룹이다.여기서 두 번째 매개변수는 Array의 인스턴스일 수도 있고 arguments 객체일 수도 있습니다.예를 들면 다음과 같습니다.
function sum(num1, num2) {
    return sum1 + sum2;
}
function callSum1(num1, num2) {
    return sum.apply(this, arguments);
}
function callSum2(num1, num2) {
    return sum.apply(this, [num1, num2]);
}

alert(callSum1(10, 10));   //20
alert(callSum2(10, 10));   //20

위의 예에서callSum1은sum() 함수를 실행할 때this를this값으로 전송했다(전역 역할 영역에서 호출되었기 때문에 전송된 것은 window 대상이다)와arguments 대상이다.callSum2 역시sum() 함수를 호출하지만,this와 하나의 매개 변수 그룹을 전달합니다.
call () 방법은 apply () 방법의 작용과 같고, 그것들의 차이는 매개 변수를 수신하는 방식이 다르기 때문이다.call () 방법의 경우 첫 번째 파라미터는this값에 변화가 없고 다른 파라미터는 함수에 직접 전달된다.예를 들면 다음과 같습니다.
function sum(num1, num2) {
    return num1 + num2;
}
function callSum(num1, num2) {
    return sum.call(this, num1, num2);
}

alert(callSum(10, 10);   //20

사실상 전달 매개 변수는 apply()와call()의 진정한 용무가 아니다.그것들의 진정한 강점은 함수를 확장하여 운행하는 작용역을 넓힐 수 있다는 것이다.예를 들면 다음과 같습니다.
window.color = "red";
var o = {color, "blue"};

function sayColor() {
    alert(this.color);
}

sayColor();   //"red"

sayColor.call(this);   //"red"
sayColor.call(window);   //"red"
sayColor.call(o);   //"blue"

이번에sayColor () 는 전역 함수로 정의되었고, 전역 역할 영역에서 호출될 때this에 대한 정의입니다.color의 값을 구하면 window로 변환됩니다.color의 값을 구하다.그리고sayColor.call(this)과sayColor.call (window) 은 전역 역할 영역에서 함수를 현저하게 호출하는 두 가지 방식입니다.하지만 SayColor를 실행하면콜(o)할 때 함수의 실행 환경이 달라진다. 이때 함수 체내의this 대상이 o를 가리키기 때문에 결과는'blue'이다.콜()(또는 apply())를 사용하여 작용역을 확장하는 가장 큰 장점은 대상이 방법과 어떠한 결합 관계도 필요 없다는 것이다.
ECMAScript는 또한 bind() 방법을 정의합니다.이 방법은 함수의 실례를 만들 것입니다. 이this 값은bind () 함수에 귀속되어 전달됩니다.예를 들면 다음과 같습니다.
window.color = "red";
var o = {color: "blue"};

function sayColor() {
    alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();   //"blue"

여기서 sayColor () 는bind () 를 호출하고 대상 o를 전송하며 objectSayColor () 함수를 만듭니다.objectSayColor () 함수의this는 o와 같기 때문에 전역 역할 영역에서 이 함수를 호출해도 "blue"를 볼 수 있습니다.

좋은 웹페이지 즐겨찾기