function func(arg1, arg2) {
console.log(arg1, arg2);
}
func(); // (출력값) undefined undefined
func(1); // (출력값) 1 undefined
func(1, 2); // (출력값) 1 2
func(1, 2, 3); // (출력값) 1 2
function add(a, b) {
// arguments 객체 출력
console.dir(arguments);
return a + b;
}
console.log(add(1)); // (출력값) NaN
console.log(add(1, 2)); // (출력값) 3
console.log(add(1, 2, 3)); // (출력값) 3
var myObject = {
name: ‘foo’,
sayName: function () {
console.log(this.name);
}
};
var otherObject = {
name : ‘bar’
};
// otherObject 객체 생성
var otherObject.sayName = myObject.sayName;
// sayName() 메서드 호출
myObject.sayName(); // (출력물) ‘foo’
otherObject.sayName(); // (출력물) ‘bar’
1) 전역 객체와 전역 변수의 관계를 보여주는 예제 코드
var foo = “I’m foo”; // 전역 변수 선언
console.log(foo); // (출력값) I’m foo
console.log(window.foo); // (출력값) I’m foo
2) 함수를 호출할 때 this 바인딩을 보여주는 예제 코드
var test = ‘This is test’;
console.log(window.test);
// sayFoo() 함수
var sayFoo = function() {
console.log(this.test); // sayFoo() 함수 호출 시, this는 전역 객체에 바인딩된다.
} ;
sayFoo();
// 출력값
This is test
This is test
3) 내부 함수를 호출했을 경우
// 전역 변수 value 정의
var value = 100;
// myObject 객체 생성
var myObject = {
value: 1,
func1: function() {
this.value += 1;
console.log(‘func1() called. this.value: ‘ + this.value);
// func2() 내부 함수
func2 = function() {
this.value += 1;
console.log(‘func2() called. this.value: ‘ + this.value);
// func3() 내부 함수
func3 = function() {
this.value += 1;
console.log(‘func3() called. this.value : ‘ + this.value);
}
func3();
}
func2();
}
};
myObject.func1();
// (출력값)
func1() called - this.value : 2
func2() called - this.value : 101
func3() called - this.value : 102
< 수정된 버전 >
// 내부 함수 this 바인딩
var value = 100;
var myObejct = {
value : 1,
func1 : Function() {
var that = this;
this.value += 1;
console.log(“function1() called - this.value: “ + this.value);
func2 = Function () {
that.value += 1;
console.log(“func2() called - this.value : “ + that.value);
func3 = function () {
that.value += 1;
console.log(“func3() called - this.vlaue: “ + that.value);
}
func3();
}
func2();
}
};
myObject.func1();
// (출력값)
func1() called - this.value : 2
func2() called - this.value : 3
func3() called - this.value : 4
4) 생성자 함수를 호출할 때 this 바인딩
// 생성자 함수의 동작 방식
// Person() 생성자 함수
var Persion = function (name) {
// 함수 코드 실행 전
this.name = name;
// 함수 리턴
};
// foo 객체 생성
var foo = new Person(‘foo’);
console.log(foo.name); // (출력값) foo
// 생성자 함수
function Person(name, age, gender, position) {
this.name = name;
this.age = age;
this.gender = gender;
}
// Person 생성자 함수를 이용해 bar 객체, baz 객체 생성
var bar = new Person('bar', 33, 'woman');
console.dir(bar); // 프로토타입 : Person
var baz = new Person('baz', 31, 'man');
console.dir(baz); // 프로토타입 : Person
// new를 붙이지 않고 생성자 함수 호출 시의 오류
var qux = Person(‘qux’, 20, ‘man’);
console.log(qux);
// (출력값) undefined -> new를 붙히면 새로 생성된 객체가 리턴되지만 지금은 일반 함수로 호출되었으므로 undefined가 리턴된다.
console.log(window.name); // (출력값) qux
console.log(window.age); // (출력값) 20
console.log(window.gender); // (출력값) man
(p.114 객체 생성하는 패턴 추가필요)