'JavaScript'에 해당되는 글 16건
- 2011/12/10 CoffeeScript, CoffeeScript 가 바로 생각나지 않는 JavaScript 코드들.
- 2011/11/10 CommonJS 두번째 살펴보기. (2)
- 2011/10/25 JavaScript, split과 join으로 구현한, replaceAll 함수
- 2011/06/14 About JavaScript String
- 2011/03/27 AsyncTrigger.js
- 2011/03/25 함수 생성
- 2011/03/23 Prototype의 초기화 과정
- 2011/01/27 replace 의 두번째 function의 매개변수에 관하여...
- 2010/04/21 HTML Target 속성에 지정된 값에 관하여...
- 2009/12/03 자바스크립트 this에 대한 오해와 진실(The this keyword of javascript)
CoffeeScript, CoffeeScript 가 바로 생각나지 않는 JavaScript 코드들. [ Coffeescript, JavaScript, 자바스크립트, 커피스크립트 ]
Computer 2011/12/10 10:00"setTimeout" on JavaScript.
setTimeout 은 자바스크립트에서 자주 쓰이는 평범한 함수의 형태입니다.
setTimeout(function(){
eat('food');
}, 6000);
CoffeeScript 코드로 바꾸려면 어떻게 해야 할까요?
"setTimeout" on CoffeeScript.
저는 이렇게 작성했습니다. 바로 생각이 나지 않더군요.
setTimeout ()->
eat 'food'
, 6000
"assert.response" on JavaScript
JavaScript TDD 프레임웍인 expresso에서 assert.response 는 이렇게 생겼습니다.
assert.response(server, {
url: '/foo',
method: 'POST',
data: 'bar baz'
}, {
body: '/foo bar baz',
status: 200
}, function(res){
// All done, do some more tests if needed
});
커피 스크립트로, 어떻게 작성해야 할까요?
"assert.response" on CoffeeScript
많은 변종을 거쳐서 다음과 같은 코드가 작성되었습니다. 테스트 링크
assert.response server
,
url: '/foo'
method: 'POST'
data: 'bar baz'
,
body: '/foo bar baz'
status: 200
,
(res) ->
# All done, do some more tests if needed
뭘 기억하고 싶은 거냐면...
CoffeeScript 코드를 작성하다 자주 오류가 나는 부분을 정리해 놓은 것입니다.
CommonJS 는 JavaScript API를 정의하는 단체(=Group)이다.
자바스크립트는 빠르고 강력한 언어가 되었지만, 현재의 표준 JavaScript 스팩은 브라우져 환경을 벗어날 수 있는 API를 제공해 주지 못하고 있다.
CommonJS 는 JavaScript가 갖지 못한 API,
즉, Java 나 Ruby, Python이 갖고 있는 Standard Library API와 같은 API를 추가로 정의해서,
JavaScript를 범용 언어와 같이 만들고자 하는 것이다.
CommonJS 에서 가장 먼저 완성한 스팩은 Modules/1.0 이다.
(대부분이 말하는 CommonJS 를 따른다. 혹은 CommonJS 이다 라는 표현은, 이 CommonJS 모듈 스팩을 준수하고 있다 라는 뜻이다.)
Kris Kowal 님이 만드신, "CommonJS: JavaScript Everywhere" 라는 슬라이드 자료
매우 간단하게 요약하자면,...
- Slide 5, 슬라이드에 초반에 Python 코드가 등장,
- Slide 6, JavaScript 로 Python 코드와 같은 코드를 작성할 수 있지만, 그 모든 방법은 표준이 아니다.
- Slide 7, 특히, 모듈, 파일 시스템, 웹 서버 게이트 웨이(?), 바이너리 데이터 등등이 표준에 없다.
(ECMAScript의 브라우져 관련 API는 표준으로 있는데,...) - Slide 8, CommonJS에서 표준화를 하자!
- Slide 11, CommonJS는 API 이다.
- Slide 16 ~ 49, CommonJS 표준엔 Modules 1.1 부터.. Packages 까지 정의가 되어 있다.
- Slide 52 ~ 53, (CommonJS API를 이용해서) 처음 등장한 Python 코드와 같은 역활을 하는 JavaScript 코드로 작성!!
CommonJS에서 표준화 작업중인 내용들
현재(2011.11.18), 아래와 같은 내용(=CommonJS 위키 페이지에서 확인 가능)들이 토론되어지고 있는 중이다.
- Uniform Baseline / 글로벌 (discussion) - 여러 JS 엔진에서 동일하게 동작하도록 하기위한 토론.
- 모듈 (1.1.1)
binary: 바이너리 데이터 타입 (byte arrays and/or strings) (proposals, discussion, early implementations)encodings: 인코딩과 문자열 (proposals, discussion, early implementations) -io: I/O 스트림 (proposals, discussion)fs,fs-base: 파일 시스템 (proposals, discussion, early implementations)system: 시스템 인터페이스 (stdin, stdout, stderr, &c) (1.0, amendments proposed)assert,test: 단위 테스트 (1.0, amendment proposals pending)sockets: 소켓 I/O TCP/IP 소켓 (early proposals)event-queue: 리액터(=Reactor, 이벤트 발생자)/이벤트 큐 (early proposals)worker: 워커(Worker) (공유하지 않는 동시(=concurrent) 프로세스/쓰레드) (proposal)console: 콘솔(=console) (proposal)
- 패키지 (1.0)
- Package Mappings (proposal)
- Web Server Gateway Interface (JSGI) (proposals, discussion, early implementations)
- Promises (proposal) - 비동기 처리를 위한 스팩
JavaScript, split과 join으로 구현한, replaceAll 함수 [ JavaScript, join, replaceAll, SPLIT ]
Computer 2011/10/25 13:49Daum 에 사용되고 있는 Jigu 라는 JavaScript 라이브러리 에는 문자를 치환하는 replaceAll 이라는 함수가 존재한다.
해당 함수는 정규 표현 식을 통한 치환 역시 지원하지만,
난 단순히 텍스트를 치환하는 코드를 통해 느낀 바가 커서 이곳에 기록해 두기로 마음 먹었다.
Code
function replaceAll(s, findstr, newstr) {
// .. 생략, 이곳에서 정규 표현식 처리 ..
return s.split(findstr).join(newstr);
}
코드의 내용은 어렵지 않다, 단순히 찾고자 하는 단어를 기준으로 자른 배열을 만들고(split), 새로운 단어를 구분자로 사용하는 문자열을 만들라(join)는 코드이다
이 코드가 훌륭하다고 느끼는 이유는 split, join 모두 Native 함수라는 것. 그리고 그 연산으로 replaceAll을 만들어 낸 것이다.
The backspash character (\) has a special purpose in JavaScript string
...
Is the \' escape, which represents the single quote character.
예전에 읽었던 내용이였는데, 까먹었던 내용이다 겹따옴표(") 사이에 겹따옴표나 홑따옴표(') 사이에 홑따옴표는 백슬래시(\)와 함께 쓰면 된다는 것을.
"\"I\'m ok!?\""
근데, 더 충격적인 사실은, JavaScript 문자열과 JSON 문자열이 다르다는 사실이다.(자세한 내용은 여기서 보자.)
설명
비동기로 호출되는 함수들이 모두 호출되기를 기다린 후, 어떤 작업을 해야 할 경우를 위한 라이브러리.사용 방법
AsyncTrigger 생성
var aTrigger = new AsyncTrigger();
감시할 Callback 함수 생성
var cbFunc1 = aTrigger.getCallback(function(response) {
// 콜백 함수에서 해야 할 내용
});
var cbFunc2 = aTrigger.getCallback(function(xhrResponse) {
// 콜백 함수에서 해야 할 내용
});
onComplete 함수(=이벤트) Override
aTrigger.onComplete = function() {
// 모든 콜백이 호출된 다음 수행해야 할 작업.
}
첨부파일
그리고..
아직 사용해 본적은 없어요.foo; // 'undefined'
foo(); // this raises a TypeError
var foo = function() {};
Due to the fact that var is a declaration, that hoists(=올리다.) the variable name foo before the actual execution of the code starts, foo is already defined when the script gets executed.
JavaScript Garden
즉 다음과 같은 코드로 해석된다는 이야기.
var foo;
foo; // 'undefined'
foo(); // this raises a TypeError
foo = function() {};
빈 객체가 생성되면, new 연산자는 해당 객체의 프로토타입을 설정한다. 이때 생성된 객체는 자신을 만들어낸 생성자의 prototype 값을 자신의 프로토타입으로 설정한다. 모든 함수에는 prototype이라는 프로퍼티가 있는데, 이것은 함수가 정의될 때 부터 자동으로 새성되고 초기화 된다. prototype 프로퍼티의 초기값은 프로퍼티가 하나 있는 개체로 지정된다. 이 프로퍼티는 constructor 라고 불리우는 데 프로토타입이 연관되어 있는 생성자 함수를 가르킨다.
자바스크립트 완변가이드, 202 페이지
replace 의 두번째 function의 매개변수에 관하여... [ arguments, function, JavaScript, replace, 매개변수, 자바스크립트, 치환 ]
Computer 2011/01/27 00:40
> "Handsome Guy".replace("Guy","Sangpil")
'Handsome Sangpil'
하지만 복잡하게 사용할 수도 있다. 우선 첫번째로 "Guy" 대신, 정규표현식이 들어갈 수 있고,"Sangpil"대신 함수가 들어갈 수 있다. 다음처럼,...
> "Handsome Guy".replace(/Guy/, function(){return "Sangpil";});
'Handsome Sangpil'
이런 형태로 쓰일때, 함수는 기본적으로 다음과 같은 매개변수를 받게 된다.첫번째 - 정규표현식과 일치하는 문자열
두번째 - 정규표현식 내에 존재하는 첫번째 구룹문자.
세번째 - 정규표현식 내에 존재하는 두번째 구룹문자.
...
뒤에서 두번째 - offset: 일치하는 문자열의 시작 위치 값.
마지막 - 입력된 전체 문자열.
위의 예제에서 살펴보면,
첫번째 - 'Guy'
뒤에서 두번째 - 9 (9번째 Index 값에 Guy의 'G' 가 나타남.)
마지막 - 'Handsome Guy'
이 경우는 정규표현식에 그룹이 없기 때문에 의미상의 두번째 세번째... 매개변수는 넘어오지 않게 된다.
마지막으로 잊지 말아야 할 것은, 전역으로 검사를 할 경우, 뒤에 함수도 매칭된 수 만큼 호출된다는 것이다.
function replacer(str, p1, p2, offset, s){
return "!HERE!";
}
var newStr = "XXXXz XXXzz XXzzz Xzzzz".replace(/(X+)(z+)/g, replacer);
console.log(newStr); // !HERE! !HERE! !HERE! !HERE!
출처: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace
HTML의 A 태그에는 target이라는 속성이 존재한다. 그리고 그 Target은 해당 액션의 결과를 표시할 창을 가리키는 속성값이다.
최근에 알게 된 사실이지만 이 속성값에도 아래와 같이 _top, _self 등과 같이 이미 지정된 값이 존재했다.
_top
어느 프레임에서 아래 링크를 클릭하던, 해당 프레임을 포함한, 최고 상단 페이지가 이동한다.
<!-- HTML --> <a href="http://blog.sangpire.pe.kr" target="_top">
// JavaScript top.location.href = "http://blog.sangpire.pe.kr";
_self
현재 페이지 또는 프레임 주소만 변경.
<!-- HTML --> <a href="http://blog.sangpire.pe.kr" target="_self">
// JavaScript self.location.href = "http://blog.sangpire.pe.kr";
_parent
부모(parent)페이지를 이동.
<!-- HTML --> <a href="http://blog.sangpire.pe.kr" target="_parent">
// JavaScript parent.location.href = "http://blog.sangpire.pe.kr";
_blank
항상 새로운 창으로 이동.
<!-- HTML --> <a href="http://blog.sangpire.pe.kr" target="_blank">
구체적인 이름
이 외에도 특정 이름을 갖은 창에 주소를 바꿀 수도 있다. 이때 해당 이름의 창이 존재하지 않으면 _blank 와 같이 새 창으로 링크가 열리게 된다.
<!-- HTML sub는 창 이름, 없을 경우 새창으로. --> <a href="http://blog.sangpire.pe.kr" target="sub">
자바스크립트 this에 대한 오해와 진실(The this keyword of javascript) [ JavaScript, misunderstanding, This ]
Computer 2009/12/03 21:38기존에 내가 알고 있던 this 에 대한 이해 - 모든 메소드는 메소드를 실행하는 객체를 this로 가르킨다.
이건 오해였다. 그런가?..
실제로 동작하는건 다음과 같았다. 우선 alertName 이라는 함수를 생각해 보자.
var Babo = function() {
this.name = "바보";
};
Babo.prototype.alertName = function() {
alert(this.name);
};
var babo = new Babo();
babo.alertName();
alertName은 위와 같이 단순히 this의 name 속성을 화면에 띄워주는 역할을 한다.
위의 예제를 실행하며, "바보"가 출력될 것이다.
다음과 같이 버튼의 onclick 이벤트에 함수를 할당 해주면,
<button id="button1" name="버툰">Who am I</button>
<script type="text/javascript">
var button1 = document.getElementById("button1");
button1.onclick = babo.alertName;
</script>
그리고 버튼을 클릭(Click) 하게 된다면, 무엇이 표시될까?
바로 "버툰" 이라는거..
그럼 다음의 경우는?
var NewBabo = function() {
this.name = "신바보";
};
NewBabo.prototype.alertName = function() {
babo.alertName();
};
var newBabo = new NewBabo();
newBabo.alertName();
이 경우는 무엇이 출력될까?.. "신바보" 또는 "바보"?
정답은 "바보" 다. 함수를 호출 할 때, 함수 안에서 this는 그 함수를 소유하고 있는 객체를 가르키게 되는 것이다. 위의 경우 babo.alertName()은 alertName() 이 여전히 babo의 것이기 때문에 "바보"가 출력되는 것이다. 그럼 위의 onclick의 경우는 왜? "버툰"이 출력 되는 것일까?
이건, button1의 onclick 이벤트에 babo의 alertName 함수를 복사해 놓았기 때문이다. 이제 onclick은 babo의 alertName과 동일한 일을 하게 되는 것이고, onclick의 소유주는 button1 이기 때문에, button1의 이름인 "버툰"이 출력되는 것이다.
즉, 결론은 모든 메소드는 메소드의 주인(Owner)을 this로 가르킨다. 단 이때 메소드를 복사(주인 교체)한 경우와 메소드를 참조(주인 불변)인 경우를 주의하자!!!
보다 명쾌한 해설은 참고 링크를 읽어보자~~!!
결론
In Javascript 'this' always refers to the "owner" of the function we're executing. or rather(더 정확하게 말하자면), to the object that a function is a method of. - ppk
참고 자료
- http://www.quirksmode.org/js/this.html - 매우 이해하기 쉬운 정리
이 글은 스프링노트에서 작성되었다가 뭐가 마음에 안들어 HTML을 직접 수정 하였습니다.
AsyncTrigger_0.1.js