General
Strict Mode (μ격 λͺ¨λ)
μ€ν¬λ¦½νΈ μλ¨ νΉμ ν¨μμ μμ λΆλΆμ 'use strict'
μ μ μΈνλ©΄ Strict Mode
λ‘ μ½λλ₯Ό μμ± ν μ μλ€.
'use strict';
/* statement */
function foo () {
'use strict';
/* statement */
}
Strict Mode
λ λ¬Έλ²κ²μ¬μ λ°νμ λμμ κ²μ¬ν΄μ£Όλ κΈ°λ₯μ νλλ° κ·Έ μνμ λ€μκ³Ό κ°λ€.
- κ²½κ³ λ₯Ό μλ¬λ‘ λ³ν
read only
κ°μ²΄λ μμ λΆκ°get
μΌλ‘ μ μΈλ κ°μ²΄λ μμ λΆκ°extensible
νΉμ±μ΄ false λ‘ μ€μ λ κ°μ²΄μ μμ± νμ₯ λΆκ°delete
μ°μ° μ¬μ© λΆκ°Literal Object
μ λμΌν μ΄λ¦μ Property μμ± λΆκ°- 8 μ§μ λ° Literal λ° escape λ¬Έ μ¬μ© λΆκ°
- κΈ°μ‘΄μλ 무μλλ μλ¬λ€μ Throwing νλ€.
- μ΅μ ν μμ μ λμμ€λ€. (νΉμ μ€ν¬λ¦½νΈ μ½λκ° λΉ¨λ¦¬ ν΄μλκ²λ ν¨)
- ν₯ν λ²μ μμ μ μλ λ¬Έλ²λ€μ κΈμ§νλ€.
μ°Έκ³ μλ£
http://beomy.tistory.com/13
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Strict_mode
μΌκΈκ°μ²΄ (First-Class Object)
μλ°μ€ν¬λ¦½νΈλ μΌκΈκ°μ²΄ (First-Class Object) μ
λλ€.
μΌκΈ κ°μ²΄ (First-Class Object) λ λ€μκ³Ό κ°μ νΉμ§μ κ°μ΅λλ€.
- μΌκΈ κ°μ²΄λ λ³μμ μ μ₯ κ°λ₯ ν΄μΌ νλ€.
- μΌκΈ κ°μ²΄λ ν¨μμ νλΌλ―Έν°λ‘ μ λ¬ ν μ μμ΄μΌ νλ€.
- μΌκΈ κ°μ²΄λ ν¨μμ λ°νκ°μΌλ‘ μ¬μ© ν μ μμ΄μΌ νλ€.
- μΌκΈ κ°μ²΄λ μλ£κ΅¬μ‘°μ μ μ₯ ν μ μμ΄μΌ νλ€.
JSONP
μΉ λΈλΌμ°μ λ SOP (same origin policy: λμΌμΆμ²μ μ±
) μ λ°λΌ μλ‘ λ€λ₯Έ λλ©μΈκ°μ λ°μ΄ν° ν΅μ μ μ ννκ³ μλ€
script μ½λκ° DOM νΈλ¦¬μ μΆκ°λμ΄ μ€νλλ©΄ μΈλΆ μ€ν¬λ¦½νΈλ₯Ό λ‘λν μ μλ€λ κ² μμ μ°©μ
<script>
νκ·Έλ SOP μ μ±
μ μνμ§ μκΈ° λλ¬Έμ jsonp (json width padding) μ΄ μ¬μ©λ¨
JSONP μ callback μ μλ²μμ μ§μ ν΄μ€μΌ μ μμ μΌλ‘ μ¬μ©μ΄ κ°λ₯
μ€ν¬λ¦½νΈ νκ·Έ μ½μ μΌλ‘ callback ν¨μ jsonp ꡬννκΈ°
var callback = '_callback_jsonp_' + Math.round(10000 * Math.random());
var script = document.createElement('script');
script.src = 'http://localhost:8080/getJSON.json?callback=' + callback;
document.body.appendChild(script);
window[callback] = function (data) {
delete window[callback];
/* μ½λ°± μ€ν λ‘μ§ */
}
μμ² URL λ€μ callback νλΌλ©ν° μΆκ°νμ¬ jsonp μμ² κ΅¬ννκΈ°
Client
$.getJSON('/jsonp.json?callback=?', function (data) {
console.log('success: ', data);
});
Server
private void doGet(HttpServletRequest request, HttpServleteResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String callBack = request.getParameter("callback");
JSONObject obj = new JSONObject();
obj.put("result", id);
obj.put("go", "ν
μ€νΈ");
PrintWriter out = response.getWriter();
out.write(callBack + "(" + obj.toString() + ")");
System.out.println(callBack + "(" + obj.toString() + ")");
out.flush();
out.close();
}
μμ² json μ callback ν¨μλ‘ νλ² κ°μΈμ jsonp ꡬννκΈ°
Client
$.ajax({
url: "/jsonp.json",
dataType: 'jsonp',
jsonpCallback: "myCallback",
success: function(data) {
console.log('μ±κ³΅ - ', data);
},
error: function(xhr) {
console.log('μ€ν¨ - ', xhr);
}
});
Server
myCallback({"message":"You got an AJAX response via JSONP from another site!"});
jsonpCallback μ΅μ μμ΄ μ¬μ©νκΈ°
Client
$.ajax({
url: "/jsonp.json",
dataType: 'jsonp',
success: function(data) {
console.log('μ±κ³΅ - ', data);
},
error: function(xhr) {
console.log('μ€ν¨ - ', xhr);
}
});
Server
jQuery18305806868467951786_1366340807385({"key":"value"});
jsonp
λ‘ μ λ¬ λ°λ μλ΅λ°μ΄ν°λ λ€μκ³Ό κ°λ€.
_callback_jsonp_({
"code": 1,
"message": "success",
"result_set": {}
});
TIP
μ λ¬ λ°λ λ°μ΄ν°λ₯Ό μ½λ°± ν¨μμ 맀κ°λ³μλ‘ μ λ¬νμ¬ μ€ν μν€λ ꡬ쑰
CORS μ€μ μ νλ€λ©΄ λ³λμ jsonp μμ
μ νμ μλ€.
μμ² λ°μ΄ν°μ μλ΅ ν€λκ° Access-Control-Allow-Orign: *
μΌλ‘ λ³κ²½
μ묡μ μ μ
μλ°μ€ν¬λ¦½νΈ λ΄μ λ³μ μ μΈμμ μ μΈμ (var
) κ° μμΌλ©΄ μ묡μ μ μ μΌλ‘ μΈν΄ μ μ νλ‘νΌν° (window object property) λ‘ λ±λ‘ λλ€.
var a = 0;
b = 2;
(function () {
c = 3;
}());
delete a;
delete b;
delete c;
console.log(typeof a); // number
console.log(typeof b); // undefined
console.log(typeof c); // undefined
νλ‘νΌν°λ
delete
μ°μ°μλ‘ μμ κ°λ₯
μμ (Inheritance)
νλ‘ν νμ μ μ΄μ©ν νμ₯
μλ°μ€ν¬λ¦½νΈμλ μλ°μ λ¬λ¦¬ class
κ° μ‘΄μ¬νμ§ μμ prototype
μ μ¬μ©νμ¬ class λ₯Ό ꡬνν©λλ€.
μμ Class μμ±
Example #1 : JS - ES5
function Shape() {
this.x = 0;
this.y = 0;
}
Shape.prototype.move = function (x, y) {
this.x += x;
this.y += y;
}
function Rectangle() {
Shape.call(this);
}
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
μμ κ°μ²΄ μμ±
Example #1 : JS - ES5
var rect = new Rectangle();
console.log(rect instanceof Rectangle);
console.log(rect instanceof Shape);
rect.move(1, 1);
νλ‘ν νμ μ νμ₯μ μ΄μ©ν λ°©λ² μ Monkey Patching μ΄λΌκ³ λ νλ©° κΆμ₯νμ§ μλ λ°©λ² μ΄λ€.
Object.create()
λ₯Ό μ΄μ©ν λ©μλ μμ
Example #1 : JS - ES5
var parent = {
num: 2,
increase: function () {
return (this.num + 1);
}
}
console.log(parent.increase()); // 3
var child = Object.create(parent);
child.num = 12;
console.log(child.increase()); // 13
μλ£ν (λ³μν) μ λν μ°¨μ΄μ
ES 5 & 6 μ μ§μνλ μλ£ν (λ³μν) var
let
const
μ λ€μκ³Ό κ°μ μ°¨μ΄μ μ κ°μ§λ€.
var | let | const | |
---|---|---|---|
μ ν¨λ²μ | function scope | block scope | block scope |
μ¬ν λΉ | O | O | X |
νΈμ΄μ€ν (Hoisting)
μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ€ν 컨ν
μ€νΈλ₯Ό μμ±νλ©΄μ scope λ₯Ό μ μν λ κΈ°μ λ μμμ μκ΄μμ΄ μ μΈλΆμ λν μ²λ¦¬ ν΄μμ μ°μ μμλ₯Ό μ΅μ°μ μΌλ‘ λμ΄μ¬λ € λ¨Όμ ν΄μ νλ κ²
μ΄λ λ€μκ³Ό κ°μ νΉμ§μ κ°λλ€.
- λ³μμ μ μκ° κ·Έ λ²μμ λ°λΌ μ μΈκ³Ό ν λΉμΌλ‘ λΆλ¦¬ νλ€.
- μ μΈκ³Ό ν λΉμ΄ λΆλ¦¬λλ©° μλ¬λ₯Ό μΌκΈ°μν¬ μ μλ€.
- ES6 μμλ νΈμ΄μ€ν μ μ§μμ΄ μμ΄μ‘λ€. (ES5 μμ νΈμ΄μ€ν / TDZ κ΄μ )
- κΈ°μ‘΄ ES5 μμλ νΈμ΄μ€ν μ΄ μμ΄ ν΄λΉ κ°μ μ μΈ ν νΈμΆνλ©΄ undefined λ‘ λμ¨λ€.
μμ μ½λ
Example #1 : JS - ES5
var value = 'outer scope';
(function () {
console.log(value); // undefined
var value = 'inner scope';
});
μ μ½λλ μλμ κ°μ΄ ν΄μ λλ€.
var value = 'outer scope';
(function () {
var value;
// undefined
console.log(value);
var value = 'inner scope';
});
var
μ λΉν΄ const/let
μ TDZ μ μν΄μ ReferenceError
κ° λ°μνλ€.
const value = 'outer scope';
(function () {
console.log(value);
const value = 'inner scope';
}());
TDZ (Temporal Dead Zone) ?
μ΄κΈ°ν (μ μΈ) κ° λμ§ μλ κ°μ²΄λ€μ μ°Έμ‘° ν μ μλ€.
νΈμ΄μ€ν
μ΄ λμ§ μλκ²μ μλ - ES5 μ²λΌ undefined
λ‘ μ ν λΉμ΄ μλ¨
ν¨μμ μ μΈκ³Ό ννμ
ν¨μ μ μΈμ (Function Declarations / Function Statement)
μ€ν κ°λ₯ν μνκ° μλλ©° ν¨μμ μ μλ₯Ό λνλ΄λ Statement
μΌλ‘ μ½λ ν΄μμ λ°λ₯Έ μν κ²½κ³Όκ° μ‘΄μ¬ νμ§ μλλ€.
Example #1 : JS - ES5
// ν¨μ μ μΈμ
function foo() {
/* statement */
}
ν¨μ ννμ (Function Expressions / Function Literal)
μ€ν κ°λ₯ν μν μ½λ λ‘ ν΄μλμ΄ μ§κ±°λ νΉμ λ³μλ λ°μ΄ν° ꡬ쑰μ ν λΉ λμ΄ μμμ μλ―Ένλ€.
Example #1 : JS - ES5
// ν¨μ ννμ
var foo = function () {
/* statement */
}
ν¨μμ μ μΈμμ νΈμ΄μ€ν μ μν₯ μ λ°μ§λ§, ν¨μμ ννμμ νΈμ΄μ€ν μ μν₯μ λ°μ§ μλλ€.
μ΅λͺ ν¨μ (Anonymouse Function)
ν¨μμ μ μΈμ΄ μλ ν¨μ ννμμ μ΄μ©νλ λ°©λ² μ΄λ©° μ¦μ μ€ν ꡬ문μ λ§λ€λ λ§μ΄ μ¬μ©λλ€.
μ΅λͺ ν¨μλ λμ μΌλ‘ ν λΉλλ μ ν¨λ²μλ₯Ό κ°μ§κΈ° λλ¬Έμ κ°μ μ μΈ μ ν¨λ²μλ₯Ό μ€μ νλ κ²½μ°μλ μ¬μ© λλ€.
Example #1 : JS - ES5
(function () {
var value = 'Hello World';
}());
console.log(value); // ReferenceError: value is not defined
μ¦μ μ€ν ꡬ문 (IIFE : Immediately-Invoked Function Expression)
μ΅λͺ ν¨μ (Anonymouse Function) λ₯Ό μ΄μ©νμ¬ λ°λ‘ μ€ν κ°λ₯ν ν¨μ ννμμ μ΄μ© νμ¬ λ§λ€μ΄ λ΄λ ꡬ문
Syntax
(function () {
/* μ€νμ½λ */
}());
Example
κΈ°λ³Έμ μΈ μ¬μ©λ²
(function () { /* statement */ })();
(function () { /* statement */ }());
(() => { /* statement */ })(); // With ES6 arrow functions (though parentheses only allowed on outside)
λ€λ₯Έ λ°©μμΌλ‘ μ€νμ κ°μ νλ λ°©λ²
!function () { /* statement */ }();
~function () { /* statement */ }();
-function () { /* statement */ }();
+function () { /* statement */ }();
void function () { /* statement */ }();
Design Pattern β