자바 script 의 함수 호출 과 구조 함수 호출 을 배 워 주세요.
대상 을 대상 으로 하 는 프로 그래 밍 에서 functions, methods 와 class constructor 는 세 가지 서로 다른 일 로 서로 다른 문법 으로 이 루어 집 니 다.그러나 자바 스 크 립 트 에서 이 세 가지 개념 은 모두 function 에 의 해 이 루어 지고 세 가지 서로 다른 모델 을 통 해 이 루어 진다.
가장 간단 한 사용 모드 는 function 호출 입 니 다.
function hello(username) {
return "hello, " + username;
}
hello("Keyser Söze"); // "hello, Keyser Söze"
2. 방법의 호출
한편, methods 라 는 개념 이 JavaScript 에서 표현 한 것 은 한 대상 의 속성 은 하나의 function 이다. 똑 같은 함수 로 한 대상 의 구성원 에 게 값 을 부여 한 후에 달라 진다.함 수 를 대상 의 구성원 에 게 할당 한 후, 이것 은 함수 가 아니 라 방법 이 라 고 해 야 합 니 다.
var obj = {
hello: function() {
return "hello, " + this.username;
},
username: "Hans Gruber"
};
obj.hello(); // "hello, Hans Gruber"
진정한 행 위 는 호출 자체 가 this 가 어느 대상 에 연결 되 는 지 결정 하 는 것 입 니 다. 즉, ob1. hello () 는 this 를 ob1 에 연결 하고 ob2. hello () 는 this 를 ob2 에 연결 합 니 다.한 마디 만 기억 해라, 누가 호출 하면 this 는 누 구 를 가리킨다
바로 this 바 인 딩 의 이러한 규칙 때문에 아래 의 용법 도 가능 합 니 다.
function hello() {
return "hello, " + this.username;
}
var obj1 = {
hello: hello,
username: "Gordon Gekko"
};
obj1.hello(); // "hello, Gordon Gekko"
var obj2 = {
hello: hello,
username: "Biff Tannen"
};_
obj2.hello(); // "hello, Biff Tannen"
그러나 일반적인 함수 에서 위의 hello 함수 와 같이 this 키 워드 를 사용 하 는 것 은 좋 지 않 습 니 다. 직접 호출 될 때 this 의 지향 이 문제 가 됩 니 다.이러한 상황 에서 this 는 전역 대상 (GlobalObject) 을 가리 키 는데 브 라 우 저 에 서 는 일반적으로 window 대상 이다.이런 행 위 는 불확실 하고 무의미 하 다.
따라서 ES5 표준 에서 strict mode 를 사용 하면 this 는 undefined 로 설 정 됩 니 다.
function hello() {
"use strict";
return "hello, " + this.username;
}
hello(); // error: cannot read property "username" of undefined
이러한 방법 은 잠재 적 인 오 류 를 더욱 빨리 드 러 내 고 오 작 동 과 찾기 어 려 운 bug 를 피하 기 위 한 것 이다.일반 함수 호출 과 방법 호출 을 구별 하고 이 예 를 직접 보면 명확 하 다.
var func = function() {
alert(this);
};
var o = {};
o.fn = func;
//
alert(o.fn === func);//true
//
func();//[object Window]
o.fn();//[object Object]
이 실행 결 과 는 두 함수 가 같 기 때문에 인쇄 결 과 는 true 입 니 다.그러나 두 함수 의 호출 이 다 르 기 때문에 func 의 호출 은 [object Window] 로 인쇄 되 었 고 o. fn 의 인쇄 결 과 는 [object Object] 입 니 다.
여기 가 바로 함수 호출 과 방법 호출 의 차이 입 니 다. 함수 호출 에서 this 는 전체 대상 window 를 말 합 니 다. 방법 에서 this 는 현재 대상, 즉 o. fn 중의 this 는 대상 o 를 말 합 니 다.
3. 구조 함수 의 호출
function 의 세 번 째 사용 모드 는 constructor 로 서 의 사용 입 니 다.
구조 기 중의 this
우 리 는 대상 을 만 드 는 과정 을 분석 해 야 this 의 미 를 알 수 있 습 니 다. 아래 코드 와 같 습 니 다.
var Person = function() {
this.name = " ";
};
var p = new Person();
여기 서 먼저 함수 Person 을 정 의 했 습 니 다. 다음은 전체 실행 을 분석 하 겠 습 니 다.
구조 기의 return
구조 함수 에서 return 의 의미 에 변화 가 생 겼 습 니 다. 우선 구조 함수 에서 한 대상 으로 되 돌아 오 면 원래 의 의 미 를 유지 합 니 다. 만약 에 비 대상, 예 를 들 어 숫자, 불 과 문자열 을 되 돌려 준다 면 this 로 돌아 갑 니 다. return 문장 이 없 으 면 this 로 돌아 갑 니 다. 아래 코드 를 보 세 요.
// return
var ctr = function() {
this.name = " ";
return {
name:" "
};
};
//
var p = new ctr();
// name
alert(p.name);
// , " ". , return , return . :
//
var ctr = function() {
this.name = " ";
return " ";
};
//
var p = new ctr();
//
alert(p);
alert(p.name);
코드 실행 결 과 는 [object Object] 를 먼저 팝 업 창 에 인쇄 한 다음 '조효 호' 를 인쇄 하 는 것 입 니 다. 여기 return 은 하나의 문자열 로 기본 형식 에 속 하기 때문에 여기 return 문 구 는 유효 하지 않 습 니 다. 이 대상 을 되 돌려 줍 니 다. 따라서 첫 번 째 인쇄 는 [object Object] 이 고 두 번 째 는 undefined 를 인쇄 하지 않 습 니 다.
function User(name, passwordHash) {
this.name = name;
this.passwordHash = passwordHash;
}
var u = new User("sfalken",
"0ef33ae791068ec64b502d6cb0191387");
u.name; // "sfalken"
new 키 를 사용 하여 function 을 constructor 로 호출 합 니 다.function 및 method 호출 과 달리 constructor 는 새로운 대상 을 입력 하고 this 에 연결 한 다음 이 대상 을 constructor 의 반환 값 으로 되 돌려 줍 니 다.constructor function 자체 의 역할 은 이 대상 을 초기 화하 기 위 한 것 입 니 다.
구조 함수 호출 상 범 오류
흥미진진 하 게 다음 과 같은 구조 함 수 를 정의 했다.
var Coder = function( nick ){
this.nick = nick;
};
정의 구조 함수 가 끝나 면?그래, 어서 실례 화하 자.
var coder = Coder( 'casper' );
이 coder 형제 이름 이 뭐 예요?빨리 인쇄 하기:
console.log( coder.nick ); //undefined
= =b undefined!! , : new
var coder = Coder( 'casper' ); // , this window
console.log( window.nick); // :casper
var coder = new Coder( 'casper' ); // new, ,this
console.log( coder.nick ); // :casper
이런 실 수 는 매우 저급한 것 같 지만, 발생 할 확률 이 매우 높다. 어떻게 이런 상황 의 발생 을 피하 거나 줄 일 수 있 겠 는가?내부 실현 안에서 손발 을 움 직 일 수 있다.
var Coder = function( nick ){
if( !(this instanceof Coder) ){
return new Coder( nick );
}
this.nick = nick;
};
사실은 매우 간단 합 니 다. 예화 할 때 내부 판단 에서 현재 this 가 가리 키 는 대상 의 유형 은 현재 구조 함수 의 유형 이 아니라면 구조 함 수 를 강제로 다시 호출 할 수 있 습 니 다.갑자기 Coder 라 는 이름 이 서양 적 이지 않다 고요?Hacker 쓰 고 싶 어 요. 그래 요. 고 칠 게 요.세 어 보 니 모두 세 군데 고 쳐 야 하 는데 이것 은 과학적 이지 않 습 니 다. 구조 함수 의 이름 만 바 꾸 면 되 는 방법 이 있 습 니까?물론 있 습 니 다.
var Coder = function( nick ){
if( !(this instanceof arguments.callee) ){
return new arguments.callee( nick );
}
this.nick = nick;
};
tips: ES 5 의 엄격 한 모드 에서 arguments. callee 는 사용 되 지 않 는 다 고 합 니 다. 그러나 ES 5 가 보급 되 는 동시에 엄격 한 모드 를 사용 해 야 한다 고 지 정 했 습 니 다. 그렇지 않 으 면 사 고 를 발산 할 수 있 습 니 다.
이상 은 본 고의 모든 내용 이 므 로 여러분 들 이 함수 호출, 방법 호출 과 구조 함수 호출 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.