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

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

ただいまの
回答率

90.48%

  • JavaScript

    16957questions

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

  • Node.js

    1933questions

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

変数名を隠して処理?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 610

omusoba

score 19

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

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...」の部分を書き換えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • omusoba-san

    2016/05/14 23:08 編集

    変数 = 変数名でした

    キャンセル

  • kei344

    2016/05/14 23:12 編集

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

    キャンセル

  • kei344

    2016/05/14 23:28

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

    キャンセル

  • omusoba

    2016/05/14 23:32 編集

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

    キャンセル

回答 3

checkベストアンサー

+1

何も考えずに(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 10:56

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

    キャンセル

  • 2016/05/15 13:48

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

    キャンセル

  • 2016/05/15 14:06

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

    ご協力いただいた皆様、誠にありがとうございます。
    とても勉強になりました!

    キャンセル

+1

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

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


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

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

console.log( (function(n) {
  if (n === 1) {
    return 1;
  }
  return n * arguments.callee(n - 1);
} )(10) );

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/14 23:22

    内容としてはnの値に数値が入った場合に

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

    と同じような処理を行うという内容でした。
    説明が足りず申し訳ありません。

    キャンセル

  • 2016/05/15 05:06

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/15 14:07

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

    キャンセル

関連した質問

  • 受付中

    JavaScriptのプロトタイプチェーンについて

    JavaScriptのプロトタイプチェーンのgetPrototypeOf(obj)を使った書き方を教えてください。下記のコードをprotoを使わずにgetPrototypeOf(o

  • 解決済

    javascriptのグローバルオブジェクトとは?

    コンストラクタ以外の関数でthisキーワードを参照した場合は、そのメソッドが所属しているオブジェクトが参照されます。と参考書に書いてあったのですが、コードで表すとどういう風なもので

  • 受付中

    javascriptのクロージャでメモリリークが起こる場合

    javascriptのクロージャでメモリリークが起こる場合があると思います。 var hoge = function(){     var x = 0;     process.

  • 解決済

    jQueryで特定の要素をクリックしたときの処理

    jQueryまたはjavascriptを使って下記のような処理をしたいです。    1.特定の要素をクリックする    2.(1.)でクリックした以外の場所をクリックしたときに

  • 受付中

    JavaScriptのImageオブジェクトの画像サイズ取得

    JavaScript(jQuery)で下記のようにImageオブジェクトを生成し、画像を読み込んだあとに、縦横サイズを取得し、その値を次の処理で使いたいのですが、画像の読込は非同期

  • 解決済

    引数のオプションの入力チェック関数

    引数のオプションの値の入力チェックの関数の実装の話です。 絶対条件 ・オプションは文字列で指定される ・オプションはなくてもいい(長さ0バイトの空文字) ・abcABC

  • 解決済

    関数と変数の巻き上げの違いとは

    javascriptは、ほかの言語と違い関数内に宣言された局所変数は、関数内全体で有効なので宣言前でもundefindになりますが呼び出せます。ただ、解かりやすくするため、関数の最

  • 解決済

    eval

    javascriptのeval関数は、引数として与えられた文字列をjavascriptのソースとして扱うものです。 最後に評価された値を戻り値にする、必要以上に使わない、与えた引

同じタグがついた質問を見る

  • JavaScript

    16957questions

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

  • Node.js

    1933questions

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