1. javacommons

    Posted

    javacommons
Changes in title
+JavaScriptで内部関数(名前空間に公開したくない関数)を用いる方法(とっても大事なクイズだよ!)
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,65 @@
+以下のコードを実行すると test2 関数の方が速いんですけど、みなさんこの理由わかりますか?
+両方とも、add、sub という外部に公開したくない内部関数を定義する方法です。
+
+```
+test1: 6.788ms
+test2: 3.052ms
+```
+
+```js
+const COUNT = 1000000
+
+function test1() {
+ function add(a, b) {
+ return a + b
+ }
+ function sub(a, b) {
+ return a - b
+ }
+ return add(11, 22) + sub(33, 44)
+}
+
+var test2 = (function () {
+ function add(a, b) {
+ return a + b
+ }
+ function sub(a, b) {
+ return a - b
+ }
+ return function() {
+ return add(11, 22) + sub(33, 44)
+ }
+}());
+
+console.time('test1')
+for (let i=0; i<COUNT; i++ ) test1()
+console.timeEnd('test1')
+console.time('test2')
+for (let i=0; i<COUNT; i++ ) test2()
+console.timeEnd('test2')
+```
+
+上記はブラウザで動作させるプログラムを作る場合の名前空間汚染を避ける手順ですが、Node.js の場合は
+
+```js:test3.js
+function add(a, b) {
+ return a + b
+}
+function sub(a, b) {
+ return a - b
+}
+module.exports = function() {
+ return add(11, 22) + sub(33, 44)
+}
+```
+
+としておいて
+
+```js:main.js
+var test3 = require('./test3')
+console.time('test3')
+for (let i=0; i<COUNT; i++ ) test3()
+console.timeEnd('test3')
+```
+
+でOKなので楽なんですね。