Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. # JavaScript Basic
  2.  
  3. ## 型
  4.  
  5. **プリミティブ**
  6.  
  7. - boolean
  8. - number
  9. - string
  10. - null
  11. - undefined
  12.  
  13. nullは「何もない」、undefinedは「未定義」(変数を宣言したけど、値を代入していない。return文を書いていない関数を呼び出した。存在しないプロパティにアクセスしたetc)
  14.  
  15. nullはわざわざ何もないことを宣言した状態、undefinedはまだ何もしていない状態
  16.  
  17. **参照型**
  18.  
  19. - array
  20. - object
  21. - function
  22. ## for..in
  23.  
  24. 指定された配列やオブジェクトのメンバーに対して処理を行う
  25.  
  26. for (仮変数 in 配列/オブジェクト) {
  27. // do something
  28. }
  29.  
  30. **例**
  31.  
  32. var member = ['太郎', '二郎', '三郎'];
  33. for (var m in member) {
  34. console.log('名前は' + member[m]);
  35. }
  36. // 名前は太郎
  37. // 名前は二郎
  38. // 名前は三郎
  39. ## オブジェクト
  40.  
  41. JavaScriptの関数はreturn文が明示されていない場合は自動的に呼び出し元にundefinedが返される。
  42. しかし、new演算子を用いた場合は自動的にオブジェクトのインスタンスが返却される。
  43. 以下の場合、obj1はmyFuncに格納されている無名関数で生成されるインスタンスが返されている。
  44. しかし、obj2は無名関数を呼び出しただけになっており、return文がないのでundefinedが返される。
  45.  
  46. var myFunc = function() {
  47. this.prop1 = 'bar';
  48. function() {
  49. this.prop1 + this.prop2;
  50. }
  51. }
  52.  
  53. var obj1 = new myFunc();
  54. var obj2 = myFunc();
  55.  
  56. console.log( obj1 ); // myFunc {prop1: "bar", prop2: "foo"}
  57. console.log( obj2 ); // undefined
  58.  
  59. new演算子がないとただの関数呼び出し、ある場合はインスタンスが返されることがわかる例:
  60.  
  61. var myFunc = function() {
  62. this.prop1 = 'bar';
  63. return 'boo';
  64. }
  65. var obj1 = new myFunc();
  66. var obj2 = myFunc();
  67.  
  68. console.log(obj1); // myFunc {prop1: 'bar'};
  69. console.log(obj2); // boo
  70. ## this
  71.  
  72. 関数内で呼び出す`this`は関数呼び出し元のオブジェクトを参照する。
  73. しかし、new演算子を用いてインスタンス化した場合、`this`はそのオブジェクト自身をさす。
  74.  
  75. ## 関数
  76.  
  77. **argumentsオブジェクト**
  78. 呼び出し元から渡された引数を管理しているオブジェクトで、関数本体のスコープ内部で使用可能
  79.  
  80. var addFunc = function() {
  81. console.log(arguments[0] + arguments[1]);
  82. }
  83.  
  84. addFunc(1, 2) // 3
  85.  
  86. argumentsオブジェクトにはlengthメソッドを呼び出すこともできる
  87.  
  88. var addFunc = function(val1, val2) {
  89. if (arguments.length != 2) {
  90. throw new Error('引数の数が違います!');
  91. }
  92. console.log(val1 + val2);
  93. }
  94.  
  95. addFunc(1) // Uncaught Error: 引数の数が違います!
  96.  
  97. **名前つき引数**
  98.  
  99. function showInfo(args) {
  100. var name = args.name;
  101. var age = args.age;
  102.  
  103. console.log(name + ' ' + age);
  104. }
  105.  
  106. showInfo({ name: 'Iga', age: 35 });
  107.  
  108. **高級関数**
  109. JavaScriptの関数は、関数の引数や戻り値に設定することができる**高級関数**
  110.  
  111. function higherOrder(values, fnc) {
  112. for (val in values) {
  113. fnc(values[val]);
  114. }
  115. }
  116.  
  117. higherOrder( [1, 3, 5], function(val) {console.log(val)} ); // 1, 3, 5
  118. ## スコープチェーン
  119.  
  120. JavaScriptがどんな順序で変数やプロパティを参照するか決めたルール
  121.  
  122. - Callオブジェクト:関数を呼び出すたびに内部的に生成されるオブジェクト
  123.  
  124. スコープチェーンはGlobalオブジェクトとCallオブジェクトを、生成した順に連結したリストのようなもの
  125. このリストは一番最初に生成されるGlobalオブジェクトを末端とし、Callオブジェクトが生成されるたびにその先端に紐付いているようなイメージ
  126. JavaScriptの変数解決はこのリストの先頭からたどって、一番最初に見つかった値が採用される
  127.  
  128. var x = 'Global';
  129. var y = 'Global';
  130.  
  131. function outerFunc() {
  132. var x = 'Local Outer';
  133.  
  134. function innerFunc() {
  135. var x = 'Local Inner';
  136.  
  137. console.log(x); // Local Inner
  138. console.log(y); // Global
  139. console.log(z); // undefined
  140. }
  141.  
  142. console.log(x); // LocalOuter
  143. innerFunc();
  144. }
  145.  
  146. console.log(x); // Glabel
  147. outerFunc();
  148. ## クロージャ
  149.  
  150. ローカル変数を参照している、関数の中に定義している関数
  151. 以下では、ローカル変数:`count`、関数の中に定義している関数:`innerFunc()`
  152.  
  153. function closure(initVal) {
  154. var count = initVal;
  155.  
  156. var innerFunc = function() {
  157. return ++count;
  158. };
  159.  
  160. return innerFunc;
  161. }
  162.  
  163. var myClosure = closure(100);
  164. console.log(myClosure()); // 101
  165. console.log(myClosure()); // 102
  166. console.log(myClosure()); // 103
  167.  
  168. 上の例では、innerFunc関数がGlobalオブジェクトであるmyClosureに格納されるため、closure関数が実行終了しても破棄されない。
  169. スコープチェーンが破棄されず、innerFuncのCallオブジェクトも破棄されず、そのローカル変数countも破棄されないので、代入された値が残り、呼び出しのたびにincrementされる。
  170.  
  171. ## プロトタイプ
  172.  
  173. オブジェクトには、メンバ(プロパティ、メソッド)を追加するためのprototypeプロパティというものがある
  174.  
  175. var Phone = function(name) {
  176. this.name = name;
  177. };
  178.  
  179. Phone.prototype.getName = function() {
  180. return this.name;
  181. };
  182.  
  183. var featurePhone = new Phone('feature phone');
  184. var smartPhone = new Phone('smart phone');
  185.  
  186. console.log(featurePhone.getName()); // feature phone
  187. console.log(smartPhone.getName()); // smart phone
  188.  
  189. インスタンス化したオブジェクトは、コンストラクタで定義されているメンバ分のメモリ領域を都度確保する。
  190. プロパティはインスタンス毎に違う値になるのでそれでいいが、メソッドはインスタンスに関係なく同じ振る舞いをするので、コンストラクタで定義すると個別にメモリを確保するのは無駄になってしまう。
  191. **インスタンス化されたオブジェクトは、使用したコンストラクタのprototypeプロパティに対して暗黙の参照を持つ**。**prototypeプロパティに格納したメソッドにも暗黙の参照を持っているので、自前でメソッドを持つ必要がない**。これで、無駄なメモリ領域の確保が防げる。
  192. 次のようにリテラル表記もできる。
  193.  
  194. var Phone = function(name, model, color) {
  195. this.name = name;
  196. this.model = model;
  197. this.color = color;
  198. };
  199.  
  200. Phone.prototype = {
  201. getName : function() { return this.name; },
  202. getModel : function() { return this.model; },
  203. getColor : function() { return this.color; }
  204. }
  205.  
  206. **プロトタイプチェーン**
  207. prototypeプロパティを使ってJavaScriptで継承を行うための仕組み。
  208. 以下の`SmartPhone.prototype = new Phone();`の部分で、継承したいオブジェクトのインスタンスを自身のprototypeプロパティに格納し、インスタンスが自身のメソッドを見つからなければ、prototypeプロパティに格納されたプロパティ(親オブジェクトのプロパティ)にメソッドを見つけに行くと言う挙動をするようになる。
  209.  
  210. var Phone = function() {};
  211.  
  212. Phone.prototype = {
  213. getOwner : function() {
  214. console.log('Owner is', this.owner);
  215. }
  216. };
  217.  
  218. var SmartPhone = function(owner) {
  219. this.owner = owner
  220. };
  221. // EXTENDS
  222. SmartPhone.prototype = new Phone();
  223.  
  224. SmartPhone.prototype.tap = function() {
  225. console.log('tap!');
  226. }
  227.  
  228. var myPhone = new
  229.  
  230. SmartPhone('igarashi');
  231. myPhone.getOwner(); // Owner is igarashi
  232. myPhone.tap(); // tap!
  233.  
  234. var otherPhone = new SmartPhone('tarama');
  235. otherPhone.getOwner(); // Owner is tarama
  236. otherPhone.tap(); // tap!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement