함수는 선언되면 자바스크립트는 함수가 가진 코드를 일단 넘어가고 호출되면 그때 다시 돌아와 코드를 실행합니다!
<script>
function 함수(a=10, b=20, c=30){
return a+b+c
}
함수() //60
함수(100) //150
함수(100,200) //330 a가 100, b에 200
함수(100,200,300) //600
함수(c=300) //330 이 아니고 350입니다.순서대로 들어갑니다. a에 300이들어가요.
함수(a=100, c=300) //430
함수(a=100, b=300, c=300) //순서가 뒤바뀌면 안됩니다.
</script>
<script>
function 함수3 (a,b,c,d,e,f) {
return a
}
console.dir(함수3) // length:6
//length가 파라미터의 수
</script>
<script>
function 로그인정보({
// = 를 쓴 이유는 할당하는 거에요.
회원등급 = 'Gold',
글쓰기 = true,
글읽기 = true,
채널관리 = true,
백업 = '1주일 이내 가능',
소셜로그인여부 = true
}) {
console.log('...함수기능...')
console.log(회원등급, 글쓰기, 글읽기, 채널관리, 백업, 소셜로그인여부)
}
로그인정보({}) ////로그인정보() 로 호출하면 안됩니다. 에러나요
//출력값
...함수기능...
Gold true true true 1주일 이내 가능 true
---------------------
로그인정보({
회원등급 : 'Silver',
소셜로그인여부 : false, //순서가 바뀌었지만 괜찮아요
백업: '3일 이내 가능' //중간에 생략된 값도있쥬
}) //전달해주는 형태는 이렇게 obj로
//출력값
...함수기능...
Silver true true true 3일 이내 가능 false
</script>
<script>
function 함수({
a=1,
b=2,
c=3
} = {}){ // = {}이렇게 해야하는건 알아두셔야합니다
console.log(a,b,c)
return a+b+c
}
함수()// 6
함수({})//6
함수({b:10}) // 14
</script>
스코프
: 변수에 접근할 수 있는 유효범위
let
과 const
는 블록 레벨 스코프를 가지고있어요.<script>
{
let x = 10
const y= 20
}
console.log(x,y) // 안됩니다. {} 밖에 못나와용.
------------------------------
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
</script>
<script>
let a = 10
let b = 10
function 함수1() {
let a = 20
let b = 20
function 함수2() {
let a = 30
console.log(a, b)
}
함수2()
}
함수1() //30,20
</script>
<script>
let x = 100
function 함수() {
let y = 20
console.log(x)
}
함수() // 100
</script>
참고: https://cotak.tistory.com/143
변수나 함수 선언문이 해당 스코프의 최상단으로 끌어올려지는 현상을 말합니다. 즉, 코드에서 변수나 함수를 선언하기 전에 해당 변수나 함수를 사용할 수 있는 것처럼 보이는 현상을 의미
<script>
함수(10)
function 함수(x) {
return x + 100
}
//110
</script>
<script>
////둘다 error! 왜냐면 let과 const로 함수를 선언해줘서 쓸거면 미리 선언하고
//그 다음부터 사용할수있다.
//앞에다가 미리 선언해야한다.
함수(10)
let 함수 = x => x + 100
// error가 생깁니다.
함수(10)
const 함수 = function (x) {
return x + 100
}
</script>
<script>
let a = 10
if(true){
let a=20
if(true){
console.log(a)
let a = 30
}
} //에러남 //일시적 사각지대
//스코프체이닝통해 위로올라감. a가 위로올라가는데
//console.log(a)에선 30이아직들어가지않았음그래서에러남.
//let a라고 선언하면 최상단으로 올라감. 대신30은가져가지않아요.
</script>
<script>
// 익명 즉시 실행 함수
(function () {
let a = 1;
let b = 2;
return a + b;
}());
// 선언과 동시에 바로 실행하겠다 //형태를 기억해주세요
// 기명 즉시 실행 함수
(function foo() {
let a = 3;
let b = 5;
return a * b;
}());
주의! foo()// 에러뜸. 즉시 실행 함수는 밖에서 호출할 수 없습니다.
</script>
<script>
let test1 = [10,20,30]
function 값변경1(arr){
arr[0]=100
}
값변경1(test1)
console.log(test1) //[100,20,30]
// text1 -> 메모리주소 a
//arr -> a
-------------------------------------------------
let test2 = 100 //메모리는 b //test2 -> b
//value -> b
function 값변경2(value){
value = 1000 //value -> 1000가리킴
}
값변경2(test2) //100
//test2는 여전히 b를 가리킴
--------------------------
call by ref 가 없는 반례
// 반례
var a = {}; //메모리주소 0x1001 // a -> 0x1001
//b-> 0x1001
function test(b) {
b = 1000; //1000의 메모리주소는 0x1010 // b -> 0x1010 //a ->0x1001
}
test(a)
a //{} 빈객체 뜸 //다른언어의 경우 call by ref로 동작하여 a의 값이 1000으로 바뀜.
//주소값을 넘기는거다...
</script>
call by value
아규먼트에 값이 넘어올 때 복사한 값이 넘어온다!
call by reference
아규먼트에 값이 넘어올 때 주소값이 넘어온다! (주소값이 넘어왔으니 접근을 하면 원본이다!)
javascript는 참조값을 넘길 때 참조한 주소값을 '복사'하여 넘깁니다. 그래서 call by reference가 아니라 call by value입니다. '복사한 값'인거죠. 주소값도 값이니까요.
APi application programming interface
application을 프로그래밍하는데 필요한 도구
//let은 선언하고 그 다음부터 사용할수있어요
//코드를밑에다넣고 왜 실행안되지...? 아 위에 써야하구나! 이정도?