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

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

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

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

Q&A

解決済

4回答

567閲覧

JavaScript の関数のあり方について

babbleman

総合スコア107

JavaScript

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

0グッド

1クリップ

投稿2020/02/04 07:39

JavaScriptにおいて関数はオブジェクトのようなものであると習ったのですが、

例えば関数を引数として渡す際に()をつければ即実行
そうでなければオブジェクトのみを渡すと言う認識なのですが

例えばsetIntervalなどでは関数に()をつけたものをダブルコーテーションで囲わないといけないですが、これはどう言う意味を持つのでしょうか?

私の認識に誤りがございましたら御指摘を願いたいです。

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

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

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

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

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

guest

回答4

0

setInterval

これは古い書き方を互換性のためにのこしてあるだけで
あくまでも例外的な処理だと理解してください

投稿2020/02/04 07:42

yambejp

総合スコア116734

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

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

0

ベストアンサー

JavaScriptにおいて関数はオブジェクトのようなものであると習ったのですが、

ようなものではなくオブジェクトです。
(オブジェクトの一種で、Functionオブジェクトとなる)
詳しくは下記をご覧ください。

関数 - JavaScript | MDN

例えば関数を引数として渡す際に()をつければ即実行
そうでなければオブジェクトのみを渡すと言う認識なのですが

前者が少し違います。
()で即時実行した際は、その引数に入れた関数が返す値が、引数に渡されます。
後者は、だいたいその認識で合っていると思います。

例えばsetIntervalなどでは関数に()をつけたものをダブルコーテーションで囲わないといけないですが、これはどう言う意味を持つのでしょうか?

WindowOrWorkerGlobalScope.setTimeout() - Web API | MDN

の通りです。
記載の通り、文字列を与えるのは、evalと同じような実行になるため、推奨されていないようですね。
(文字列をスクリプトコードとして評価する = 攻撃を受けやすくなる・セキュリティホールになりやすい)
参考記事は、setTimeoutですが、setIntervalも同様かと思われます。

投稿2020/02/04 08:09

編集2020/02/04 08:38
miyabi_takatsuk

総合スコア9555

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

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

Zuishin

2020/02/04 08:22

第一級オブジェクトはオブジェクト指向で言うオブジェクトの一種ではありません。 第一級オブジェクトの一種としてオブジェクトがあり、その一種として関数オブジェクトがあります。
miyabi_takatsuk

2020/02/04 08:30

Zuishinさん > ご指摘ありがとうございます。 回答修正します。
guest

0

JavaScriptにおいて関数はオブジェクトのようなものであると習ったのです

JavaScriptはオブジェクト指向言語ですから関数はオブジェクトですよ。

はいそこ、全く分かってませんね?
軽く解説しましょう。

オブジェクト指向言語に於けるオブジェクトというのは、
生物を分類するのに背骨のある無しで「脊椎動物」と「無脊椎動物」に分けた。
それと同じレベルです。

JavaScriptに於いて配列も関数もDateも皆オブジェクトです。
この時のオブジェクトというのはメソッドやプロパティが生えてて活用出来るという意味です。

js

1> 'ねこ'.charAt(1) 2// 'こ'

文字列の"ねこ"charAtなんてメソッド何時定義したんだ!?
JavaScriptのString型charAtというメソッドを所持しているという決まりがあるから使えるんです。

関数は確かに根っこはオブジェクトであり、Object型からの派生です。
ほら、メソッドやプロパティもちゃんとあるでしょ?

しかし魔改造しまくって似ても似つかぬ作りになり、
function() {}みたいな大本からかけ離れた専用の構文まで用意されている全くの別物です。


setIntervalはyambejpさんの回答で完成されているので割愛します。

投稿2020/02/04 09:14

miyabi-sun

総合スコア21203

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

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

miyabi_takatsuk

2020/02/04 09:29

> しかし魔改造しまくって似ても似つかぬ作りになり、 今いろいろ改めて検証してましたが、めちゃ納得です。 よくわからん生き物な気さえします。 thisの扱い・・・。
guest

0

関数は状態を持ちません。なので、同じ引数を与えられると、常に同じ値を返します。

オブジェクトは、変数やメソッドをメンバーとして持ちえますので、それらの値が状態を構成します。変数やメソッドの値は、状態によって影響を受けます。

状態を持つか、状態を持たないか、というのは非常に重要な性質なので、注意してください。

「関数はオブジェクトのようなもの」というのが、何を根拠にして、誰が言ったのか知りませんが、正しくありません!

投稿2020/02/04 08:19

coco_bauer

総合スコア6915

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

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

miyabi_takatsuk

2020/02/04 08:40 編集

javascriptにおいては、関数も、メンバもメソッドも持ち得ますよ。
maisumakun

2020/02/04 09:06

> 関数は状態を持ちません。 っ「クロージャ」
miyabi_takatsuk

2020/02/04 14:21 編集

maisumakunさん > ほんとだ・・・。 クロージャ(定義スコープで実行も含め)だと、thisには、呼び出し元入ってますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問