下記のようなコードが掲載されていたのですが、JavaScriptでは定数に関数を指定できるのでしょうか?
javascript
1const hoge = (z) => z + 10
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
const
は再代入不可能、ブロックスコープである事を除けば、基本的には var
と同じです。
他に特筆すべきは hoisting しない事でしょうか。
Re: re97 さん
投稿2016/04/15 04:52
編集2016/04/15 04:54総合スコア18189
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のバグです.
※ let
はconst
同様strictモードでブロックスコープに属しますが,再代入可能です.ただし再宣言はできません.
※ var
は関数スコープまたはグローバルスコープにしか属しません.また再代入も再宣言もできます.
投稿2016/04/15 06:47
編集2016/04/15 11:27総合スコア5223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア216
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/15 05:06
2016/04/16 08:57 編集
2016/04/16 09:24
2016/04/17 01:58
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
総合スコア5572
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/16 08:39
2016/04/17 03:03
2016/04/18 03:23