質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1553閲覧

変数名を隠して処理?

omusoba

総合スコア29

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/05/14 14:01

編集2016/05/14 14:38

学習のためにいろいろサイトを見ているうちに見つけた内容です。

var factorial = function (n) {
'use strict';
if (n === 1) {
return 1;
}
return n * factorial(n - 1);
};
console.log(factorial(10));

というコードがあります。
関数を宣言、定義せずに
(var factorial = function (n) {…};とfunciton factorial(n) {…} のいずれも使わずに。)
すなわち関数に名前をつけない状況になった場合、

console.log(
...function ...
);

この中の『..funstion..』の中に同様のことをするプログラムを記述するといった内容です。
要は変数を隠しての処理を行うものとして考えていました。
変数【n】に値が入った場合にコンソールの中で処理を行うとエラーばかりが起きてしまい、そもそもこの状態での処理は行ったこともなく、答えも載っていなかったのでもやもや次第です。

ご存知の方がいらっしゃいましたらご教授の程よろしくお願い致します。

【念のため問題文をそのまま貼っておきます。】
var factorial = function (n) {
'use strict';
if (n === 1) {
return 1;
}
return n * factorial(n - 1);
};
console.log(factorial(10));

というコードがあるとします。
変数名の使用を避けたい状況(関数を宣言、定義せずに(var factorial = function (n) {…};とfunciton factorial(n) {…} のいずれも使わずに。)すなわち関数に名前をつけない状況。)になった場合、同様のことをするプログラムをどのように記述すればいいか考えてください。(ただし、再帰構造はそのままで。)

解答は以下の「...function...」の部分を書き換えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omusoba-san

2016/05/14 14:09 編集

変数 = 変数名でした
kei344

2016/05/14 14:12 編集

質問文はタイトル含め編集可能なので、適宜変更されてはいかがでしょうか。また、コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
kei344

2016/05/14 14:28

「関数に名前をつけない状況になった場合」を具体的に、できればコードで記述ください。また、参照されたサイトのリンクも追記ください。
omusoba

2016/05/14 14:38 編集

ありがとうございます。 ちなみに出された問題のあるところは https://codeiq.jp/q/2815 です。 問題になった分も念のため修正して貼り付けしておきました。
guest

回答3

0

ベストアンサー

何も考えずに(funciton(){...})()で囲っては駄目なのですか?

console.log((function(x) { var factorial = function(n) { 'use strict'; if (n === 1) { return 1; } return n * factorial(n - 1); }; return factorial(x); })(10));

投稿2016/05/15 00:48

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/05/15 01:56

何も考えないのでは「学習」にならないのではないでしょうか。
unau

2016/05/15 04:48

「変数名の使用を避けたい状況」という設問の想定する状況は作為的すぎる感があり、普通にありうる状況としては「(関数名や変数名で) そのスコープを汚したくない」ということでしょうから、raccy さんのおっしゃる方法でたいていは問題が解決されるものと思います。
omusoba

2016/05/15 05:06

そもそもconsole.logの中にfunctionを組むこと自体が初めての経験でした。 そして気になったのが『再起構造はそのままで』というワード。 再帰的に呼び出すためには何か特殊なことをしなければならないのかと思っておりました。 ご協力いただいた皆様、誠にありがとうございます。 とても勉強になりました!
guest

0

エスパー気味な回答をしてしまいますが、「javascript 即時関数」あたりで検索してみてください。

投稿2016/05/14 14:29

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omusoba

2016/05/15 05:07

調べて自分でいろいろ組んでみます!
guest

0

ご質問の意味がよくわからない(何を求めてらっしゃるのか)のですが、次のように書きたい、ということなのでしょうか。

javascript

1console.log( (function f0(n) { 2 'use strict'; 3 if (n === 1) { 4 return 1; 5 } 6 return n * f0(n - 1); 7} )(10) );

f0 という関数名は外には漏れません。この関数の外からこの関数を利用するすべはありません。

arguments.callee が使える状況 (ECMAScript5 の strict mode では使えなかったと思う) では、次のように完全に無名にできます。

javascript

1console.log( (function(n) { 2 if (n === 1) { 3 return 1; 4 } 5 return n * arguments.callee(n - 1); 6} )(10) );

投稿2016/05/14 14:17

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omusoba

2016/05/14 14:22

内容としてはnの値に数値が入った場合に var factorial = function (n) { 'use strict'; if (n === 1) { return 1; } return n * factorial(n - 1); }; と同じような処理を行うという内容でした。 説明が足りず申し訳ありません。
unau

2016/05/14 20:06

もしかして、CodeIQ とかいうサイトに出題されていた問題でしょうか (現在メンテナンス中っぽくて見られませんが、https://codeiq.jp/q/2815 かな)。 もしそうなのであれば、模範解答を出題者のブログに載せるとか書いてありますから、それを待てばいいのではないでしょうか。 また、もしそうなのであれば、出題者の想定する答えは私が書いたようなものなのでしょう。「変数名の使用を避けたい状況」ということ自体想定するのが困難です(問題を作るための作為的な状況)が、あえていうなら、グローバル汚染をしたくない、とか、再帰したいけれど関数名が動的に変わりうる、とかなのかな、と思いますが、いずれにしろ、「変数名を使わない」のは関数 factorial の方であって、関数スコープ内に閉じ込められている整数 n のことではないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問