2014년 1월 19일 일요일

맥도날드 이론

우리가 일을 하다가 점심시간이 되면 백지상태가 된다
모먹으러 갈지 정하자 하면 한명이 맥도날드 먹으러 가자 하면 모두 반발하며 다른거 먹으러 가자 하며 의견을 내놓는다
이것이 맥도날드 이론
어떠한 회의를 할때 최악의 해결책을 제시하면 사람들은 더 나은 해결책을 제시함

참고
http://mimul.com/pebble/default/2013/12/29/1388286471448.html 

2014년 1월 17일 금요일

immediately invoked function expression

<script>
함수는 표현식과 선언
fn(){} <-문
var a = fn(){}; <- 식


function(){}
 ** 식별자가 필요합니다 오류 가 발생

 식별자가 필요한 컨텍스트에 식별자가 없으면 오류가 난다 js1010

 식별자가 필요한 값 : 변수, 속성, 배열, 함수이름

 이 오류를 해결하려면!! 식별자의 등호 왼쪽으로 오도록 식을 변경한다.
(http://msdn.microsoft.com/ko-kr/library/vstudio/426stfah(v=vs.100).aspx)

 고로 +function(){} 를 붙이면 식이 됨 ~ 되고 -도 되고 !도 됨 다됨 0,fn() 이런식도 됨
 연산자가 앞에 오면 함수 문이 식으로 변함 함수는 특이함
 요것은 함수만의 특징 같음


</script>

script 로드 순서 ready, load, settimeout, $fn

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
setTimeout(function(){
alert(3);
},0);
$(window).load(function(){
alert(6);
});
$(function(){
alert(1);
});


$(document).ready(function(){
alert(5);
});
//실행순서
//$(function == $(document).ready ->  $(window).load -> settimeout
//alert(2);
</script>
 </head>

 <body>
<script>

//dom이 열리고 난 뒤 실행
//$(function(){
//alert(1);
//});
//
//alert(2);



//alert(4);

</script>

함수 프로토 타입 또 정리

<script>
//var a = function(){};
//a.prototype.x = function(){
// alert(1);
//};
//var b = new a();
//b.x();

//
//var a = function(){
// this.x = function(){
// alert(1);
// };
//}
//
//
//var b = new a();
//b.x();

//function a(){ this.x = function(){
//alert(1);
//};}
//내부에서 this.x 를 하더라도 그것이 바로 prototype으로 값이 잡히는게 아님
// new를 때리면 이 값은 그 객체의 한 값으로 잡히게 됨
// b = new a();  이런식으로 하면  b의 객체에 __proto__속성으로  x가 값이 들어가는게 아닌
//바로  b.x의 객체의 값에 바로 붙게됨

//a.prototype = {
// "a1" : "1"
//};

//var b = new a();
//alert(b.a1);
//
//var a = function(){
// this.x = "1"; //공유
//};
//
//
//var b = new a;
////a.x = "2";
////a.prototype.x = "3"; //상속
//alert(b.x);
//alert(b.x);
//
//var c = function(){
// this.x = "4";
//};
//c.prototype = b;
//c.prototype.x = "5";
//
//var d = new c;
//var c;
//function a(){
// var b = "1";
// c = b;
//}
//
//a();

function chk(x,y,z){
return arguments.callee.length;
}
var a = chk("a");

//함수가 생성되면 처음에 파라미터에 맞게 함수에 파라미터의 길이만 셋팅되고
//scope객체가 생성된다.
//[[scope]]객체에서 1,local variable 객체, 2. 그 바로 위 범위 객체 (일반적으론 global variable )
//가 셋팅이 됨, local variable에 변수 별로 x,y,z, length, arguments 객체가 셋팅됨
//arguments 객체에 순번 별로 0: 값, 1:값, 2:값, length, callee가 셋팅됨
//callee는 이 arguments객체를 호출한 원본 함수를 가르킴 callee 자체가 자신을 호출한 함수 자체를 가르킴


</script>

javascript scope

<title> [[scope]] </title>
    <script>
var e;
        function aa(a,b,c){
            var d = "1";
        }

        aa(1);

script는 싱글쓰레드임, 전통적인 스크립트 언어들은 정적메모리(const 등 ), 스텍 영역을 잡고 나머지를힙을 잡아서 프로그램을 실행한다
하지만 자바스크립트는 이런것들은 모두 브라우저에서 처리해줌(iexplore.exe, chrome.exe 등),대신 가상메모리(객체들의 집합)를 잡아서 실행함

함수란 부모 함수를 생성해야 생성됨, 기본적으로
(function(window){ }((window||global);
이런식으로 window가 전역에 바인드 되있음, 기본적으로 global이 적용됨

그 안에서 함수가 실행되면 execution context(실행영역)가 생성됨, ecmascript 3.1까진 ec라 하고 5부터는 lexical environment(어휘공간) 이라 함
실행영역이 생성되기 전에 함수가 실행될때 변수의 인자값들을 [a,b,c] 이렇게 배열식으로 넘김
그래서 ec1 = [a,b,c] 이런식으로 들어가 잇으면 함수에서 호출하는 a 인자값이 1이면 a는 1을 대입하고 나머진 undefined를 넣는다
ec자체도 해쉬맵이니까 그리고 arguments 객체에도 똑같이 넣는다  arguments객체 자체는 자신 함수를 호출하는 키 값을 잡고 잇음. callee
그리고 scope객체에 지금 현재 영역에 d가 잇으므로 d를 넣고 parent에 이 함수를 호출한 global를 넣는다. 만약
fn ee(){
    aa(){

    }
}
이랫엇으면 scope:ee.parent에 이런식으로 찾아갈꺼임
그래서 parent chain을 해서 상위 변수 값들을 찾는것임
ec가 사라질때는 함수 사용이 완료가 되면 그 함수 ec가 사라지는데 저렇게 변수 자체가 참조를 함

var f = function(){
    var a = 1;
    return function(){
        return ++a;
    };
};

var g = f();

g();
g();
alert(g());        //4

scope : parent가 참조함. 유일하게 외부 함수와 연결하는 연결고리가 살아있는데 이것을 사용하고 있으면 가비지컬렉터는 일어나지 않음
close와 비슷하게 closure 는 폐쇄란 뜻인데 공간이 폐쇄된 상태가 되어버림
이것을 자바스크립트에서 클로저라 부름

그리고 if(d = arr.length){
}
이런식으로 함 식을 평가하고 d의 값이 0이면 else로 탈것임




    </script>

javascript prototype

    <script>
        function aa(){}
        aa.prototype = {
            "a1" : "1",
            "a2" : "2"
        };
       
        function bb(){
        this.a1 = "5";
        }

//function 을 선언하면 prototype이 있고 __proto__ 가 있음, __proto__는 변경할수 없는 것이며, 현재 상속 받고 잇는것들에 대해 나타냄
//prototype은 new를 이용해 선언을 했을때 __proto__로 만들어주는 역할을 함

//new를 함으로써 __proto__의 값이 된 것임,  aa.prototype는 단순히 객체임 {},
//new aa() 는 __proto__ = {a1 : 1, a2:2}
//aa.prototype은 = {a1 : 1, a2:2} 만약 new aa() 이런식으로 해서 넣엇다면 {a1 : 1, a2:2, __proto__ :{a1 : 1, a2:2} } 이런식이 될거임
// 왜 이러냐 브랜든 할배가 10일만에 만들어서그럼 ㅋㅋ

//        bb.prototype = new aa();
//        bb.a1 = "4";        //name이 bb인 함수에 대한 값에 a1값이 들어가는것임 , prototype과는 상관없음 c로 새로운 생성자에선 당연히안넘어감
//        bb.prototype.a1 = "3";
//        var c = new bb();



// 프로토타입은 직렬화 된 상속만 가능

//        alert(bb.a2);
//        alert(bb.a1);
    </script>

2013년 12월 24일 화요일

발견법(heuristic

발견법은 인간과 기계에서 어떤 문제를 해결하거나 제어하기 위한 필요한 정보를 위해 느슨하게 적용시키고 접근을 시도 하는 전략

의사 결정을 할때 다양한 변수를 고려해야 하지만 현실적으로 정보의 부족과 시간 제약으로 인한 완벽한 의사결정을 할수 없다.
실무상의 실현가능한 해답이 필요할때 사용 하는 기법 
가장 이상적인 발견법이 아닌 현실적으로 만족할 만한 수준의 해답을 찾는것

예를 들어 '좋은 소프트웨어 설계를 하라'는 말처럼 명확한 답이 없는 문제를 경험, 직관, 시행착오를 통해 점점 만족스러운 설계로 발전시키는 과정도 발견법에 의한다고 볼 수 있다.\

예시 <<어떻게 문제를 풀것인가>>의 발견법 예
어떤 문제를 이해하기 어렵다면 그림을 그려보낟
해결법을 찾기 힘들때 해결법이 있다고 가정하고 어떤것이 그것으로부터 유도되는지 상정해본다.
문제가 추상적이라면 구체적인 예를 들어본다.
먼저 보편적인 문제를 먼저 푼다.