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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Q&A

解決済

3回答

851閲覧

chromeのconsoleを用いて即時関数(パターン)を実行したい

omiteratail

総合スコア19

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

0グッド

0クリップ

投稿2018/01/23 07:36

###前提・実現したいこと
Googleのchromeブラウザ(*1)上で使えるconsoleにて即時関数の挙動を確認したいです。

###発生している問題・エラーメッセージ
xが定義されていないと出てきます。

VM167:1 Uncaught ReferenceError: x is not defined at <anonymous>:1:3

###該当のソースコード

javascript

1(function(){ 2 var x = 5; 3})(); 4function f(y){return x+y;} 5f(x);

###質問
私の考え方自体が間違っているのかもしれないのですが、上記コードの最初の部分にて
無名関数及びその即時実行を定義しているため、
f(x);
が実行される時にはxに5が入っているのではないのでしょうか。

これがうまく動かない原因を教えていただきたいです。
よろしくお願いいたします。

(*1) Chromeのコンソールを使っているのは、手軽かつ迅速にJavaScriptの挙動を確認できるためです。何か実行ファイルを作りたいわけではなく、JavaScriptの挙動を確認したいだけです。

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

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

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

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

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

guest

回答3

0

他回答者の通りスコープの問題なのですが、コンソールで汚染したくないというだけならletを使えばいいのではないでしょうか?
ちょっとだけ打鍵が少なくなります。

JavaScript

1{ 2 let x = 5; 3 function f(y){return x+y;} 4 f(x); 5}

投稿2018/01/23 08:11

x_x

総合スコア13749

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

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

x_x

2018/01/23 08:13

と言いつつfが残ってました。良しなに
omiteratail

2018/01/23 08:50

x_xさん ご回答ありがとうございます。 今回は即時関数による挙動を把握したかったので、あえて即時関数を使用いたしました。 ただletの方が良いということが改めて認識できました。ありがとうございました。
guest

0

ベストアンサー

即時関数にかぎらず、関数内部で定義した変数はローカルスコープになります。
即時関数の中で定義した変数xは、その外では参照できません。

もともと即時関数は、一度しか使わない処理を、グローバルスコープを汚染しないように書くために使われることが多いものです。
関数内での処理結果を別の関数でまた使いたい場合、通常の関数にして、何か値を返すようにする方がよいと思います。

投稿2018/01/23 07:47

編集2018/01/23 07:48
Udomomo

総合スコア1524

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

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

omiteratail

2018/01/23 08:48

Udomomoさん ご回答ありがとうございます。 わかりやすい説明ありがとうございました!
guest

0

これがうまく動かない原因を教えていただきたいです。

即時関数の中で作った変数のスコープはその関数の中に限られますので、実行のあとだったとしても、即時関数の外側からアクセスすることはできません。

投稿2018/01/23 07:46

編集2018/01/23 07:47
maisumakun

総合スコア145184

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

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

omiteratail

2018/01/23 08:47

maisumakunさん ご回答ありがとうございます。 おかげさまですごくスッキリいたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問