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

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

新規登録して質問してみよう
ただいま回答率
85.37%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

Q&A

解決済

4回答

7223閲覧

JavaScriptでは定数に関数を指定できる?

re97

総合スコア208

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

0グッド

0クリップ

投稿2016/04/15 04:27

下記のようなコードが掲載されていたのですが、JavaScriptでは定数に関数を指定できるのでしょうか?

javascript

1const hoge = (z) => z + 10

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

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

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

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

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

guest

回答4

0

ベストアンサー

const は再代入不可能、ブロックスコープである事を除けば、基本的には var と同じです。
他に特筆すべきは hoisting しない事でしょうか。

Re: re97 さん

投稿2016/04/15 04:52

編集2016/04/15 04:54
think49

総合スコア18189

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

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

re97

2016/04/16 08:39

・回答ありがとうございました ・関数指定は再代入ではないわけですね ・なるほど ・ちょっとびっくりしました…
re97

2016/04/18 03:23

・コメント&リンク提示ありがとうございました ・大変参考になりました
guest

0

PHPを比較対象として意識した質問でしょうか?(過去質問からの推測)
PHPのconst宣言やdefine関数では以下のような制限があります.

  • constで宣言されるものはコンパイル時代入であり,最初からスカラー値でなければならない
  • constで宣言されるものは名前空間またはクラスに属する
  • PHP5.6以降は,constにて四則演算はコンパイル前に行われるようになり,配列型の代入も許可される

php

1<?php 2 3namespace Nmsp; 4 5const X = 1; // Nmsp\X = 1 6 7class Klass 8{ 9 const Y = 2; // Nmsp\Klass::Y = 2 10} 11 12const Z = [3 * 1]; // 5.6以降のみ可
  • defineで宣言されるものは実行時代入だが,計算結果がスカラー値でなければならない
  • defineで宣言されるものはグローバル空間に属する
  • PHP7.0以降は,defineにて配列型の代入も許可される

php

1<?php 2 3namespace Nmsp; 4 5define('X', 3 * 1); 6 7define('Y', [3 * 1]); // 7.0以降のみ可

後々配列型の代入が許可されるようになりましたが,それでも無名関数を代入することは相変わらず許可されていません.

一方JavaScriptのconst宣言は実行時代入任意の型を代入できるという特徴があります.またstrictモードの場合はブロックスコープに属するという点でも差異があります.たとえばfor…ofは1ループ毎に生成と消滅を繰り返すブロックスコープを形成するので,こんなコードを書くこともできます.

'use strict'; const operations = [ (a, b) => a + b, (a, b) => a - b, (a, b) => a * b, ]; for (const operation of operations) { console.log(operation(3, 2)); }

※ ただし,なぜかNode.js 5.10.1のREPLでは期待通りに動きませんでした.たぶんREPLのバグです.
letconst同様strictモードでブロックスコープに属しますが,再代入可能です.ただし再宣言はできません.
varは関数スコープまたはグローバルスコープにしか属しません.また再代入も再宣言もできます.

投稿2016/04/15 06:47

編集2016/04/15 11:27
mpyw

総合スコア5223

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

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

re97

2016/04/16 08:47

・回答ありがとうございました >PHPを比較対象として意識した質問でしょうか? ・特にそういったわけではなかったのですが… ・定数はスカラー値ONLY ・「それが全スクリプトにおける共通ルール」と勝手に思い込んでいました… >PHP7.0以降は,defineにて配列型の代入も許可される ・かなりびっくりしました…! ・いつの間にかそんなことになっていたのですね ・参考になりました
guest

0

現在の const の実装は Mozilla 特有の拡張であり、ECMAScript5 の一部ではありません。これは Firefox および Chrome (V8) でサポートされています。Safari 5.1.7 や Opera 12.00 では、const で宣言しても、後から値を変更することができます。 また、Internet Explorer 6-10 ではサポートされていません。

javascriptでconstを使わずに値の上書きを禁止する方法

によると、可能ですね。

投稿2016/04/15 04:41

編集2016/04/15 04:42
sokha

総合スコア216

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

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

re97

2016/04/16 08:57 編集

回答ありがとうございました >によると、可能ですね ・意味が分かりませんでした ・リンク先は「constを使わずに定数に近い動きを実現」だと思うのですが… ・const指定しなくても、関数に対して「定数に近い動きを実現」できるということでしょうか? ・関数に対して、Object.freeze()を使用すれば良い?
sokha

2016/04/16 09:24

最適な回答ではなかったです。 加えて古いようです。 ご指摘ありがとうございます。 失礼しました。
re97

2016/04/17 01:58

コメントありがとうございました
guest

0

たとえばこんなのもOKです。

javascript

1var f = function(x){ console.log(f); } 2// 使用時: 3f(1); // 「console.log(1);」が実行される

質問者さんが出してきた例はアロー式ですね。

javascript

1var f = (x) => x + 10; 2// 使用時: 3f(1); // 「1 + 10」が実行される 4

投稿2016/04/15 04:36

tkturbo

総合スコア5572

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

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

re97

2016/04/16 08:59

・回答ありがとうございました >たとえばこんなのもOKです ・提示いただいたコードの意味が分からなかったのですが、この場合はconstもvarも同じ結果となる、ということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問