// definition
Array.prototype.myMap = function(callback) {
arr = [];
for (var i = 0; i < this.length; i++)
arr.push(callback(this[i], i, this));
return arr;
};
//tests
var arrs = ['dic tanin', 'boo radley', 'hans gruber'];
var numbers2 = [1, 4, 9];
var goodT = arrs.myMap(function(n) {
return n; // arrs배열을 mymap함수에 적용시킨다.
});
var squareRoot = numbers2.myMap(function(num) {
return Math.sqrt(num); // 제곱근을 구하는 함수 생성
});
console.log(goodT); // [ 'dic tanin', 'boo radley', 'hans gruber' ]
console.log(squareRoot); // [ 1, 2, 3 ]
console.log("1");
function exec() {
setTimeout(function() {
console.log("2");
}, 3000);
setTimeout(function() {
console.log("3");
}, 0);
console.log("4");
setTimeout(function() {
console.log(5);
}, 1000);
}
console.log(exec());
// 위 코드 실행 결과 : 1, 4, 3, 5, 2
setTimeout의 지연시간이 0 일지라도 실행 컨텍스트가 다르기 때문에 1,4가 먼저 출력된다.
for문과 setTimeout
var i;
for (i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // 5, 5, 5, 5, 5
}, 1000);
}
// 아래 함수 정의에 포함된 인자 값은 2개
function add(a, b) {
console.dir(arguments);
}
console.log(add(1)); // Arguments(1), 0: 1
console.log(add(1, 2)); // Arguments(2), 0: 1, 1: 2
console.log(add(1, 2, 3)); // Arguments(3), 0: 1, 1: 2, 2: 3
function sum() {
for (var i = 0, result = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
}
console.log(sum(1,2,3)); // 6
console.log(sum(1,2,3,4,5,6)); // 21
// apply() 적용 전
function sum() {
console.log("arguments length : " + arguments.length);
arguments.push(100); // Uncaught TypeError: arguments.push is not a function
console.dir(arguments); // Arguments(3)
}
sum(1,2,3);
// 함수명.apply(대상, 인자 배열);
// apply() 적용 후
function sum() {
var args1 = Array.apply(arguments);
args1.push(100); // 0: 100
console.dir(args1); // Array(1)
var args2 = Array.prototype.slice.apply(arguments);
args2.push(100); // 3: 100
console.dir(args2); // Array(4)
}
sum(1,2,3);
function user(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
}
user.apply(window, ['kevin', 'durant']); // user.call(window, 'John', 'Doe'); 와 같음
console.log(window.firstName); // 'kevin'
console.log(window.lastName); // 'durant'
// 함수 선언식
var text = 'global';
function binding() {
var text = 'local';
console.log(this.text); // 'global'
console.log(this); // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
}
binding();
// 함수 표현식
var text = 'global';
var binding = function() {
var text = 'local';
console.log(this.text); // 'global'
console.log(this); // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}
}
binding();
var text = 'global';
var binding = {
text: 'local',
printText: function () {
console.log(this.text); // 'local'
console.log(this); // {text: "local", printText: ƒ}
}
};
binding.printText();
var text = 'global';
var binding = {
text: 'local',
printText: function () {
console.log(this.text); // local
var innerFunc = function () {
console.log(this.text); // global
};
innerFunc();
}
};
binding.printText();
var a = 1;
var b = 2;
function func() {
var a = 10;
var b = 20;
console.log(a); // 10
console.log(b); // 20
}
func();
console.log(a); // 1
console.log(b); // 2
var a = 1;
function func() {
var a = 2;
function innerfunc() {
return a;
}
console.log(innerfunc()); // 2
}
func();
var a = 1;
function func1() {
return a;
}
function func2(func1) {
var a = 2;
console.log(func1()); // 1
}
func2(func1);
function func() {
var a = 1;
var cl = function () {
console.log(a);
};
return cl
}
var result = func();
console.dir(result); // [[Scope]] 에서 Closure 함수임을 확인 가능
result();
var str = [
'hello ',
'',
' world'
];
function completeSentence(name) {
str[1] = name;
return str.join('');
}
completeSentence('js'); //"hello js world"
function completeSentence(name) {
var str = [
'hello ',
'',
' world'
];
return function () {
str[1] = name;
return str.join('');
};
}
var result = completeSentence('js');
result();
function completeSentence(name) {
var str = [
'hello ',
'',
' world'
];
// 입력된 문자열로 문장을 완성하는 기능
var complete = function () {
str[1] = name;
return str.join('');
};
// 문장 완성 기능을 클로져로 빼는 역할
var closure = function () {
return complete();
};
return closure;
}
var result = completeSentence('js');
result(); // "hello js world"
// 클로져로 Java 클래스와 유사하게 모듈화한 예제
var Module = (function() {
var privateProperty = 'foo';
function privateMethod(args) {
console.log('private method');
}
return {
publicProperty: '',
publicMethod: function(args) {
console.log("public method"); //undefined
},
privilegedMethod: function(args) {
return privateMethod(args);
}
};
})();
Module.privilegedMethod(); // private method
💪
캡틴판교님의 블로그를 참고했습니다.
: 배열의 원소들을 연결하여 하나의 값으로 만든다.**
문법 : var str1 = arr.join();
배열에 있는 원소들을 하나의 값으로 만든다. 원소들의 구분은 콤마(,)로 하며, 원소들의 구분을 다른 문자로 하려면 ()안에 원하는 문자를 넣으면 된다.
예제
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<script>
var jbAry = [ 'Lorem', 'Ipsum', 'Dolor' ];
var jbStr1 = jbAry.join();
var jbStr2 = jbAry.join( ' / ' );
document.write( '<p>' + jbStr1 + '</p>' );
document.write( '<p>' + jbStr2 + '</p>' );
</script>
</body>
</html>
: begin 부터 end 전까지의 복사본을 새로운 배열 객체로 반환한다. 즉 원본 배열은 수정되지 않는다.
: 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다. 이 메소드는 원본 배열 자체를 수정한다.
- 문법 : splice(start[, deleteCount[, item1[, item2[, ...]]]]);
start: 배열의 변경을 시작할 인덱스.
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var arr1 = arr.splice(10, 2, 'a', 'b', 'c');
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "a", "b", "c"]
console.log(arr1); // [11, 12]
splice() 함수를 사용하면 원본 배열인 arr이 변경된다.
10번째 인덱스부터 2개의 요소를 삭제하고 'a', 'b', 'c'를 추가했으므로
11과 12가 삭제되고 이 삭제된 요소들의 배열은 arr1 변수에 담긴다.