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

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

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

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

Q&A

解決済

7回答

543閲覧

クロージャーを利用した関数スコープ内の現在の変数名と値を取得することはできますか?

domidomi

総合スコア34

JavaScript

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

2グッド

2クリップ

投稿2019/06/20 06:45

編集2019/06/20 07:55

javascript

1function fn(n) { 2 var cnt = n; 3 return function() { 4 return ++cnt; 5 } 6} 7var f = fn(0); 8f() // 1

このようにクロージャーを使った変数の保持をしている場合、
fの現在のcntという変数名と値を取得することはできますか?

(chromeのdevtoolを用いれば見れることは知っています。)

##追記
chromeを使った場合なのですが
・関数定義&1回使用
イメージ説明
・windowオブジェクトみる
イメージ説明
・さっき作った関数を確認
イメージ説明

こんな感じでその関数に付随するスコープが確認でき、さらにその中身の値まで知ることが出来ます。
どこかに保持されているのならjavascriptを用いて(例えば実際は無いですがfunc.scopesでスコープオブジェクトが出てきたりとかで)確認する方法がないかなーと思った次第です。

好奇心からの質問であり、特に用途は考えていないのでまったくもって意味のない事の可能性もあります、すみません・・・

bisteki👍を押しています

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

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

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

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

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

macaron_xxx

2019/06/20 06:56

何をもって”取得”といっているのですか?
domidomi

2019/06/20 07:23

fという関数があると分かっている状態で fの中で宣言されている変数名(今回は"cnt")とその現在の値(今回は1度使われているので1)を 知ることが出来るのか?です。 Object.keys(obj)を用いてオブジェクトのプロパティを得る事ができるように 関数オブジェクトに紐づいているクロージャースコープの変数の値をとる手法ってないのかな? と思った次第です。
guest

回答7

0

クロージャの仕組みは、レキシカル環境(lexical environment)が関わってきます。

そして、レキシカル環境というのは、JavaScriptエンジンの内部処理を規定するための概念・用語であり、実際のコード(JavaScript)でアクセスする事は出来ません。

レキシカル環境は、....の定義に使用される仕様用のタイプです。

A Lexical Environment is a specification type used to define ...

...
レキシカル環境と環境記録の値は、純粋に仕様の仕組みであり、ECMAScript実装の特定の現実物に対応する必要はありません。 ECMAScriptプログラムがそのような値(レキシカル環境・環境記録)に直接アクセスしたり操作したりすることは不可能です。
...

...
Lexical Environments and Environment Record values are purely specification mechanisms and need not correspond to any specific artefact of an ECMAScript implementation. It is impossible for an ECMAScript program to directly access or manipulate such values.
...

クロージャとレキシカル環境の関係

レキシカル環境(lexical environment)

レキシカル環境とは、大まかにいうと、コード実行処理時に形成される領域と、それに伴う変数の記録簿の事です。また、両方を指す場合にも使われます。

コードが処理され始め、グローバルが処理されている時関数が呼び出された際に、レキシカル環境は生成されます。今JSエンジンが処理している部分を含む"領域"をレキシカル環境といい、その外側を外側レキシカル環境といいます。

例えば、以下のコードを見て下さい。

js

1// グローバル 2 3(JSエンジン処理点) 4 5var goku = "Son Goku"; 6

レキシカル環境: グローバル
外側レキシカル環境: null

です。

レキシカル環境にはgokuという識別子が記録されており、値"Son Goku"が対になって保存されています。
グローバルの外側はないので、その様な場合、外側レキシカル環境はnullになります。

また、先程述べたように、関数が呼び出された際にも、レキシカル環境は生成されます。

js

1// グローバル 2 3 4var goku = "Son Goku"; 5 6function greeting(){ 7 // ローカル(ローカル) 8 (処理点) 9 10 console.log( "hi" ) 11} 12 13 14greeting(); (処理点: 定義内処理中)

レキシカル環境: greeting関数内
外側レキシカル環境: グローバル

処理がグローバル → 関数 へ移ると、関数内の新たなレキシカル環境が生成され、グローバルを処理していた時に作成されたレキシカル環境は消滅します。

クロージャ(closure: 閉包)

クロージャとは、関数が入れ子状で定義されており、且つ、コード実行時に内側の関数が返却された場合、その返却された関数の外側レキシカル環境が維持される、というメカニズムです。

抽象的すぎて分かりにくいので、実際にコードを元に見ていきましょう。

js

1function outer() { 2 // `inner`の外側 レキシカル環境 3 4 var cnt = 0; 5 function inner() { 6 // `inner`のレキシカル環境 7 8 return ++cnt; 9 } 10 return inner; 11}

関数innerのレキシカル環境には、変数は宣言されていません。関数innerの外側レキシカル環境には、変数cntが宣言されています。

先程も言いましたが、関数が実行される際にこのレキシカル環境は生成され、変数もそこに保存されます。そして、関数の処理が終われば、この両方のレキシカル環境も消去されてしまいます。

ところがです。関数を返却する関数の場合は(関数outer)、その返却された関数(関数inner)の外側レキシカル環境は維持されたまま、関数にくっ付いた状態で返却されるのです。

ですので、返却される予定の関数inner内で、その外側レキシカル環境の変数ctnにアクセスするような処理を書いておくことにより、返却後、inner関数を実行することによって、維持された状態の外側レキシカル環境(変数)にアクセスする事ができるのです。

もちろん、変数ctnは関数内で定義されているので、その外側からはアクセスできません。

js

1function outer() { 2 var cnt = 1; 3 4 function inner() { 5 return ++cnt; 6 } 7 return inner; 8}

これがクロージャの仕組みです。

メソッドによるクロージャ

今後、余裕があれば追記致します(。•ㅅ•。)

追記

高評価を頂けた方・冷静に適切なコメントを頂けた方、ありがとうございます。一部の荒らし者がコメントに混入してきた為、追記は削除しました(。•ㅅ•。)???? 通知でご迷惑をお掛けしていたら、すみません(。•ㅅ•。)????

投稿2019/06/20 12:55

編集2019/06/21 17:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

oikashinoa

2019/06/20 23:21

どこかが間違っているのが低評価の理由ならそのむねをかいてほしいです
Lhankor_Mhy

2019/06/21 01:15 編集

クロージャの訳語は「閉包」が一般的かと。 >クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。 [クロージャ - Wikipedia]( https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3 ) その他も一般的な訳語ではないので、「話が通じない」とわかってて趣味で使うなら好きにすればいいと思うけど、初学者の人は使わないように気をつけた方がいいかも。 (マイナス評価をつけた者ではありません)
oikashinoa

2019/06/21 03:14 編集

返信ありがとうございます。 なるほど。構文解析系の用語なのかと思って斜め読みしてました。 見かけない用語が多いですが、クロージャの説明自体は間違ってないと思うのでマイナス評価までするものかなぁ。 さすがに術(メソッド)には?と来ましたけど。いや、間違ってないけどね。
Lhankor_Mhy

2019/06/21 03:27

> oikashinoaさん すみません、ご返信のつもりではなく、したがってマイナス評価の理由の推測でもなく、一般的な注意喚起としてコメントしました。わかりにくくて申し訳ないです。
oikashinoa

2019/06/21 03:30

Lhankor_Mhyさん 了解です。早とちりでした。
退会済みユーザー

退会済みユーザー

2019/06/21 04:08

oikashinoaさん!!(′ʘ⌄ʘ‵)???? その節はありがとうございました(•ᵕᴗᵕ•)⁾⁾ペコリ???? Lhankor_Mhyさんもコメントありがとうございます???? 賛同の方・そうでない方が、コメントにより話題を掘り下げて頂けるのは、誠に勝手ながら嬉しいです???? 「クロージャの説明自体は間違っていない」と言って頂き、少し胸をなでおろしています????w 他の書籍等ではこの様な説明が多かった気がするのですが、僕自身100%仕様書を読み切れていない部分もあり、実は不安が少し残る部分でもありました????w 独自用語は、 - 初学者に元の概念(英語)を理解してほしい(例: オブジェクト→物体) - カタカナ用語→参照 の手間を減らしたい という意図のもと使っております(;´ρ`)????w まぁ後は単純に「この昔ながらの翻訳違くない?」的な理由の部分(例: 変数→変値(variable))もありますが…(;´ρ`)????w 評判が宜しくないのは理解しました(๑⃙⃘◔‿◔๑⃙⃘;)w
退会済みユーザー

退会済みユーザー

2019/06/21 04:10

> Lhankor_Mhyさん 時間が被りました????w 了解です。後、「包囲→閉包」に関しては、直しておきます????????
退会済みユーザー

退会済みユーザー

2019/06/21 05:45 編集

荒らし的な人が多いので、お願いやめました(੭ ᐛ )੭????(お願いより1時間後)
Zuishin

2019/06/21 04:18

このコンパイルはさすがに恐怖の対象ですね。共和語の使用を作成するのが単商品かと思唯に来訪します。
Zuishin

2019/06/21 04:19

テストだと 0 点です。
Zuishin

2019/06/21 04:21

もとい検査だと 0 量価値です。
maisumakun

2019/06/21 04:24

定着していない訳語を無理やり使うのが間違いです。
BluOxy

2019/06/21 04:26 編集

造語による説明が初学者に悪影響だと思いましたので、低評価しました。 >初学者に元の概念(英語)を理解してほしい 初学者に都度英語の意味を辞書で調べてもらえば良いと思います。 あと、その造語を覚えたとして一般的な技術者にそれは通じませんから、初学者が誰かに説明をする際に言葉選びで混乱を招きます。最近見かけた「参照渡し」の意味について、と同じような議論が起こりますよ。 >カタカナ用語→参照 の手間を減らしたい 日本語(造語)→日本語→英語 で手間がむしろ増えているように感じられます。
Zuishin

2019/06/21 04:38 編集

!&字句環境というのは、JavaScriptエンジンの内部処理を規定するための概念・用語であり&%% 稲葉上。→???? 字句環境と動かさない口蓋舌咽喉のリーフランゲージが筆に特別に強く定着宣言未遂。
Zuishin

2019/06/21 04:32

藪からスティックも激しく超過します。
Lhankor_Mhy

2019/06/21 04:43 編集

> 初学者に元の概念(英語)を理解してほしい(例: オブジェクト→物体) object は「対象」「目的」などを含むもっと広い概念です。プログラミング術語として「物体」と訳すのは違和感があります。 property は具体的なイメージとしては「資産」「不動産」などの意味を持ちます。物理的なイメージを重視してオブジェクトを「物体」と訳すなら、プロパティは「不動産」と訳さないと一貫性がありません。
mankoman

2019/06/21 04:47

特異語彙を使い教示を行なう!⇒それは訓練により修練化された明星かつそれでも困難な事象です。一知半解の徒において流行をせざるをえなくないと思います。
macaron_xxx

2019/06/21 04:59

レキシカルを字句と訳している時点で理解してないですよね。ってことです。
Zuishin

2019/06/21 05:06

lexical environment が変わると字句は変わらなくても語彙は変わりますからね。突っ込みどころ満載ですが、字句もその一つですね。 もとい lexical environment 推移化に委譲して字句の固定位化と語彙の水形等特別委員会裁載ビコーズ。ボケナス最大積載内の要力素が字句に特別に作用します。
BluOxy

2019/06/21 05:09

造語が増えてくるともはや機械翻訳・・・
Zuishin

2019/06/21 05:16

まるで冬の神の後押しをする混沌の女神のようなことをしましたが、このような置き換えはライデンシャフトにシュツェーリアの盾を渡すようなもので変わらぬ平穏を望む者にグリュックリテートの加護は不要と思います。
Lhankor_Mhy

2019/06/21 05:26

Zuishinさん、楽しそうですね…… みなさまにメスティオノーラ様のご加護がありますように。
macaron_xxx

2019/06/21 05:27

>>カタカナ用語→参照 の手間を減らしたい >日本語(造語)→日本語→英語 >で手間がむしろ増えているように感じられます。 ここに関しては日本語(造語)→崖→死亡 しか見えないです。
Zuishin

2019/06/21 05:35

ドレッファングーアの本日の糸紡ぎはとても円滑に行われました。
oikashinoa

2019/06/21 05:40

まぁ皆さんが言いたいことは伝わったと思うので、ここいらで止めときませんか?
Zuishin

2019/06/21 05:42

またいつか、ドレッファングーアの紡ぐ糸が重なる日まで。
oikashinoa

2019/06/21 05:45

ちょうどpeg.jsというpaserについて調べていたところに字句環境と言う単語に目が行って勝手に納得した私の問題でもあります。 斜め読みしかしてない時点でいろいろ書いてスミマセン。こんなに大事になるとは。
Zuishin

2019/06/21 05:46

荒らし扱い? なぜ?
Zuishin

2019/06/21 05:47

つまりこの回答は荒らし回答だという意味の婉曲表現ですかね?
oikashinoa

2019/06/21 05:47

荒らしなんですか?そうとは思ってないですよ。
Zuishin

2019/06/21 05:47

荒らし回答ならそのように運営に言って削除依頼してください。
Zuishin

2019/06/21 05:50

低評価の理由を書いてほしいという文言が撤回されたということは、理由は分かったということですよね? そして、次も同じような荒らし回答をするようなら、同じく低評価がつくということまでわかっていただければと思います。
Zuishin

2019/06/21 05:51

そして次は理由を尋ねないでください。自明なことを尋ねても仕方がないので。
Zuishin

2019/06/21 05:55

暴言の含まれる荒らしコメントについて通報しておきました。
Lhankor_Mhy

2019/06/21 06:02

訳語に関する建設的な提案をしたのに荒らし扱いはひどいな。 Zuishinさんは仕方ないとして。
Zuishin

2019/06/21 06:05

そうですね。私は仕方ないとして。 いや、私も建設的な提案をしましたよ。独自用語なのでちょっと伝わりにくかったかもしれませんが。
hentaiman

2019/06/21 06:05

Lhankor_Mhyさんだけは荒らしじゃないだろう・・・老害ハゲオヤジかどうかは知らんが
Zuishin

2019/06/21 06:07

私も老害でオヤジですがフサフサです。
退会済みユーザー

退会済みユーザー

2019/06/21 06:08 編集

Lhankor_Mhyさん、本当にごめんなさい????????‍♂️???? 文脈読み間違えてました。本当にすみません。直しておきました_o⊇ ???? > Zuishinさん、楽しそうですね…… > みなさまにメスティオノーラ様のご加護がありますように。 を誤読しておりました????
Zuishin

2019/06/21 06:08 編集

意味が分かりませんが、この回答も荒らしなので直しておいてください。
Zuishin

2019/06/21 06:09

そうじゃないと言うなら、私が荒らしだと呼ばれる理由、そしてこの回答が荒らしでない理由を書いてみてください。
Lhankor_Mhy

2019/06/21 06:09

あ、そこは悪ノリしました。すみません。 ラノベ読みとして「本好きの下克上」ネタには乗らざるをえない……
Zuishin

2019/06/21 06:09

書けるものなら。
Zuishin

2019/06/21 06:11

低評価の理由を書けと言われて書いただけなのに、なぜそれが荒らしになるんでしょうか? そして、この回答がなぜ荒らしでないのでしょうか? 納得いく理由を書いてください。 書けるものなら。
Zuishin

2019/06/21 06:11

あ、日本語でお願いしますね。
Zuishin

2019/06/21 06:12

書けないということでいいですか?
Zuishin

2019/06/21 06:13

わかったなら、今後は反省して荒らしは控えるように。以上。
macaron_xxx

2019/06/21 06:13

AzumaOさん 私に関してもどこが荒らしなのか、理由を教えてください。 >レキシカルを字句と訳している時点で理解してないですよね。ってことです。 どこが低評価か、と聞かれたので、答えたまでです。 >ここに関しては日本語(造語)→崖→死亡 @BluOxyさんが「日本語(造語)→日本語→英語」の変換の手間が増えていると書いていましたが、私は「日本語(造語)→日本語」が無理だと書いたまでです。
退会済みユーザー

退会済みユーザー

2019/06/21 06:19

>RT Lhankor_Mhyさん いやいや、本当に申し訳ないです(。•ㅅ•。)???? メスティオノーラ様は「なろう」系のネタなのですかね✨(⁼̴̀ૢ꒳​⁼̴́ૢ๑)????✨✨ 調べておきます☺️w✨♪♪♪
Zuishin

2019/06/21 06:19

反省の色が見えないぞ。ハウス。
Zuishin

2019/06/21 06:20

✨(⁼̴̀ૢ꒳​⁼̴́ૢ๑)????✨✨
Zuishin

2019/06/21 06:20

✨(⁼̴̀ૢ꒳​⁼̴́ૢ๑)????✨✨ ☺️w✨♪♪♪
BluOxy

2019/06/21 06:24

AzumaOさん、造語はやめませんか?
Zuishin

2019/06/21 06:25

造語というか間違った荒らし回答をするたびにそのむねコメントして低評価でいい気もします。
Zuishin

2019/06/21 06:28 編集

どうせ反省するような人種ではないので、それが間違った回答だということが見る人にわかれば。✨(⁼̴̀ૢ꒳​⁼̴́ૢ๑)????✨✨ ☺️w✨♪♪♪
BluOxy

2019/06/21 06:38 編集

彼自身が書いた回答を客観的に顧みて、今回の低評価の原因に気づき、そして最後には修正してもらえるよう願っています。 が、今回は確かに駄目そうですね…✨(⁼̴̀ૢ꒳​⁼̴́ૢ๑)????✨✨
oikashinoa

2019/06/21 11:59 編集

AzumaOさんへ。 私も造語はやめてほしいと思います。 後々検索出来なくなるし、間違って覚えてしまう人もでる可能性あります。(私は構文解析系の用語と信じて呼んでました。) あと、見えてもないのにハゲとか言っても何ともならんでしょ。反論されても何の意味も持たないし。 他の方へ。 忠告のつもりなんでしょうけどラノベ系の元ネタなんでしょうかね。ネタを知らない人間からすると造語と同じくらい訳が分かりません。みんな知っているネタなんですかね? 私は納得してしまったくらい知識浅いですが、忠告できるくらいレベル高い人ならもう少しいい対応方法を考えて頂けると嬉しいです。
Zuishin

2019/06/21 12:01

造語と同じくらい訳がわからないものを鏡として持ってきただけなので、意図通りということになります。
退会済みユーザー

退会済みユーザー

2019/06/21 13:01 編集

>RT oikashinoa さん 了解しました???? 今後、teratailでは、なるべく独自翻訳用語は使わないように致します。色々と通知等で迷惑をかけて、申し訳ありませんでした(。•ㅅ•。)???? Lexical Environmentに関しましては、「解析系用語」という認識で合っていると思います。 上記回答内に仕様書の 8.1 lexical environment にリンクを張っているのですが、lexical environmentとは、「JavaScripsからは直接アクセスできない、仕様書のためのデータタイプであり」、構文解析器(parser)の処理に関する概念・用語であります。クロージャを理解するためには、JSエンジンの解析の処理に関しても説明が必要かと思い、書いた次第であります<(_ _)>???? ## 翻訳に関する経緯 この用語の翻訳に関しまして、「lexical environment 翻訳」「lexical environment プログミング」で検索をかけてみましたが、ほとんど権威的と思しきページを見つけられませんでした(私経験)。したがって、「英英辞書」、日本語類語辞典、日本語辞書にも当たり、(字母/字句) と表記した次第です。 ### lexical - [lexical - Cambridge Dictionary](https://dictionary.cambridge.org/us/dictionary/english/lexical) - [lexical - Collins Dictionary](https://www.collinsdictionary.com/us/dictionary/english/lexical) ### lexicon - [lexicon - Cambridge Dictionary](https://dictionary.cambridge.org/dictionary/english/lexicon) - [lexicon - Collins Dictionary](https://www.collinsdictionary.com/us/dictionary/english/lexicon) ### lexical の日本語翻訳 - [Weblio英語辞書](https://ejje.weblio.jp/content/lexical) - [lexical検索結果 - Linguee](https://www.linguee.jp/英語-日本語/翻訳/lexical.html) ### 字・字母・字句 - [字 -Weblio 類語辞典](https://thesaurus.weblio.jp/content/字) - [字母 -コトバンク](https://kotobank.jp/word/字母-74980) - [字句 -コトバンク](https://kotobank.jp/word/字句-518179) ### 日本語のlexical environment の 検索ヒットページ - [10.2 語彙環境 / Lexical Environment / Standard ECMA-262 5.1 Edition - webzoit.net](https://www.webzoit.net/hp/it/internet/homepage/script/ecmascript/ecma262_51/contents/10/10_2/) - [クロージャ -JavaScript.info](https://ja.javascript.info/closure)
Zuishin

2019/06/21 12:42

なぜそこまで辞書ひいたのに字母と訳そうとしたのか全くわからない。
raccy

2019/06/21 13:31

Wikipediaでもlexical scopeを字句スコープと表現しているところがあるので、lexical environmentを字句環境というのはあながち見当違いな訳とは言えないと思います。 https://ja.wikipedia.org/wiki/%E9%9D%99%E7%9A%84%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97 他にもlexical analysisを字句解析と言っていたりもします。 しかし、字句と字母はstringとcharacterぐらい違うので、字母環境という表現は、"hoge"は文字型です、と言っているぐらい違和感があります。
退会済みユーザー

退会済みユーザー

2019/06/21 14:56 編集

raccyさん、コメントありがとうございます???????? 僕も、字句環境というのも見かけましたし、4つ前のコメントの### 日本語のlexical environment の記事では「語彙環境」とされているものもありました。 改めてになりますが、僕も「この翻訳(字母環境を含む)が絶対的に正しい」などとは一ミリも思っていません。ただ、今の所、個人的意見として、「字母環境」は適切ではないか。。とは思っております???????? 「lexical environmentの日本語訳に「字母環境」が適切ではないか」という結論に至った理由を、以下にまとめてみました。 (反対の場合は、またコメ下さると嬉しいです。改めてですが、基本的な僕の姿勢として「ここで互いが納得する結論をだそう」というつもりではなく、議論してこれらに関する知識が互いに深まればいいなぁ、という感じのスタンスであります<(_ _)>???? 極部の方はそのようでは無いようですが????????w) ### lexical analysis - https://en.m.wikipedia.org/wiki/Lexical_analysis > In computer science, lexical analysis, lexing or tokenization is the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an assigned and thus identified meaning). A program that performs lexical analysis may be termed a lexer, tokenizer,[1] or scanner, though scanner is also a term for the first stage of a lexer. A lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth. ### token - https://en.m.wikipedia.org/wiki/Lexical_analysis#Token > A lexical token or simply token is a string with an assigned and thus identified meaning. It is structured as a pair consisting of a token name and an optional token value. The token name is a category of lexical unit.[2] Common token names are > > identifier: names the programmer chooses; > keyword: names already in the programming language; > separator (also known as punctuators): punctuation characters and paired-delimiters; > operator: symbols that operate on arguments and produce results; > literal: numeric, logical, textual, reference literals; > comment: line, block. ### 字句 -コトバンク(デジタル大辞泉) - https://kotobank.jp/word/字句-518179 > 文章の中の文字や語句。 ---「句」(1) ### (1)句 -コトバンク(ブリタニカ国際大百科事典 小項目事典) - https://kotobank.jp/word/句-54597 > 文法用語。言語単位の一つで,一般に,**2つ以上の単語や付属形式が連結され**,あるまとまった概念を表わし,そのままあるいは複合して文を構成するもの。英語では,2つ以上の単語がひとまとまりになって1個の単語 ... ### 字母 - コトバンク(ブリタニカ国際大百科事典 小項目事典) - https://kotobank.jp/word/字母-74980 > (1) 音を書き表わす場合の基本となるひとつひとつの文字。**単音を表わすのを原則とするアルファベットが代表**であるが,**かな文字や**デーバナーガリー文字などの**音節文字のひとつひとつも字母ということがある。**音声記号もまた,各単音に一記号を対応させて用いる方式の場合は音声字母ともいう。 これらを頭に入れた上で、 - lexical analysis の token の 表[Examples of token values](https://en.m.wikipedia.org/wiki/Lexical_analysis#Token) - 字句 - 句 - 字母 を見て頂きたいです。'{'や'+'も、tokenに入っており、lexical が分析(anaylsis)される際の基本単位になっています。 - lexical(lexicon)の意味(英語辞書) - 漢字単体・語彙の意味 - lexicalが使われる文脈 を考慮に入れると、今の所、私は「字母」という語が適切である、という判断に至りました。それ以外もかなり不評ですが。)???????? (lexical environmentも、lexical analysis と同様の意味で、仕様書で使われています。)
Zuishin

2019/06/21 15:30

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures A closure is the combination of a function and the lexical environment within which that function was declared. ごらんの通り、この lexical は字句解析で使われる用語の lexical とは別物です。別物であるので、片方を字句と訳すなら、この人みたいに混同する人が出てくるのを避けるために別の訳語をあてるべきでしょう。 しかしそれは字母ではあり得ません。これに字母という訳語をあてるのは、もう何が間違っているか説明するのもバカバカしいほどナンセンスです。 lexical environment は、おおざっぱに言えばブロックの中の環境のことです。ブロックの外で定義された名前と中で定義された名前が違うものを指す、これを環境と呼んでいます。また、これを日本語では語彙と呼びます。 https://ja.m.wikipedia.org/wiki/%E8%AA%9E%E5%BD%99 > 語彚(ごい)とは、ある特定の範囲(例えば、一つの文学作品や、一個人の発言記録など)において使われる単語の総体(「彚」は「集まり」の意味)。
raccy

2019/06/21 15:31

字母は文字です。文字列ではありません。例えば、"function"は文字列ですが、字母ではありません。コードをlexicalに分解していったとき、"function"はそれ以上分解不可能な構成単位になります。'f', 'u', 'n', ... と分解されることはありません(分解してしまうと、"function"という一綴りとしてのキーワードの意味が失われてしまいます)。私はこのようにとらえています。AzumaOさんが文字一つ一つまで分解されると考えているのであれば、パーサーを作ることはできないだろうとだけ言っておきます。 なお、JavaScriptでは、lexical environmentの境界が一つの文字からなる"{"や"}"という文字列であり、これらは一つの文字だから、字母であるという理由から字母という言葉を使っているのであれば、あまりにも他の言語を知らなさすぎです。
raccy

2019/06/21 16:14

> Zuishinさん "lexical"のニュアンスとしては、日本語の「字句的」でも「語彙的」でもなく、その中間というか、日本語として言葉が存在しない感じなのでは無いかと思っています。日本語で「字句」とすると一つ一つの単語が区別されすぎですし、「語彙」ですと単語の集合という意味あいが強すぎるという感じです。単語間の関係性というか、そういった形では無いでしょうか。 あとは、lexical environmentと関係性が深いlexical scopeと言う言葉もどう表現するのかを考慮する必要があると思います。まぁ、lexical scopeはstatic scopeでもあるので、そっちは静的スコープという割とわかりやすい(対義語のdynamic scopeが動的スコープですし)言葉があるから、そっちを主に使いたいという気分になりますが、静的環境(static environment)だと全く別の意味に聞こえそうなので、難しいところです。 あと、色々調べていたら「lexical 'this'」というパワーワードを見つけてしまい、言いたいことはわかるけど、「語彙的this」とか表現すると微妙だなと思いました。結局、無理に訳さず、「レキシカル」は「レキシカル」のまま捉えた方が、わかりやすそうだなと思ってしまいます。
hayataka2049

2019/06/21 16:39 編集

https://qiita.com/Urushibara01/items/455f8fc41f2a01fff78c によると「辞書」「索引」の方の意味かもね、だとか。真偽は知りません。 あと、上のURLの最後にリンクされている https://teratail.com/questions/41031 はlexicalを構文的としていますね。 lexical scopeのlexicalは翻訳として適当かどうかを無視して訳せば「字面的」あたりでしょうか? 字面的スコープは元のニュアンスが残りそうですが、字面的環境だと言葉が喧嘩しますね。
退会済みユーザー

退会済みユーザー

2019/06/21 17:55

> raccyさん 丁寧に解説頂きありがとうございました。僕の回答語彙を「レキシカル」に直しておきました。 raccyさんの解説により、僕が大きく間違っていた点がはっきり致しました。 解説コメントを読み、もう一度lexical, lexiconの辞書の定義を注意深く読むと、「文字一つ一つを表す」という意味では全くなく、「字母」でもなんでもありませんでした…???????? lexicon -Collins Dictionary- > 2. the special vocabulary of a particular author, field of study, etc. > 3. the vocabulary of a language or of an individual lexicon -Online Etimology Dictionary-(https://www.etymonline.com/word/lexicon) > c. 1600, "a dictionary, a word-book," from Middle French lexicon or directly from Modern Latin lexicon, from Greek lexikon (biblion) "word (book)," from neuter of lexikos "pertaining to words," from lexis "a word, a phrase; reason; way of speech, diction, style," from legein "to say," from PIE root *leg- (1) "to collect, gather," with derivatives meaning "to speak (to 'pick out words')." 今回僕がこのような状況を招いたのは、raccyさんが仰るように > あまりにも他の言語を知らなさすぎ であるという点も大きいと再認識致しました。それに加え、辞書的意味ですら誤読しておりましたし…???????? 今後、当分回答は控えます。様々な言語や概念に親しみ、もっと理解と知識と実力を身に付けようと思ます。 回答者(小生)が間違っている点を、多量の知識と経験と技術をもって、しかし1ミリも偉そうにせず、明確に論理的に指摘してくださるraccyさんのような方がおられて大変感謝であります。本当にありがとうございました(•ᵕᴗᵕ•)⁾⁾????
Zuishin

2019/06/21 21:16

raccy さん hayataka2049 さん ありがとうございます。なかなかぴったり重なる言葉がないために適当な訳語が定着していないのでしょうね。 字母は論外ですが、字句でも語彙でも辞書でも権威ある組織が使用して定着するならば私は少々のズレには目をつぶって使用できますし、実際そのような訳語も他にいくつかあります。それは翻訳につきものの悩みでしょう。 が、まだ全然通じない言葉、いやまだどころか変な笑いの出るような珍妙な独自言語をどや顔で大量に押しつけ、それが認められなければ迷惑行為を働くようなのはどうかと思うので、なんという名前か忘れましたが、彼が少しでも反省の色を見せたのは良かったと思っています。
guest

0

ベストアンサー

Object.keys(obj)を用いてオブジェクトのプロパティを得る事ができるように

関数オブジェクトに紐づいているクロージャースコープの変数の値をとる手法ってないのかな?

標準的なJavaScriptには用意されていません。

投稿2019/06/20 07:27

maisumakun

総合スコア145183

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

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

maisumakun

2019/06/20 07:28

それを逆用して、Chromeでは「スコープ内にあるけどクロージャから参照されていない変数」を最適化で除去してしまいます。プログラムから取得する方法があるのであれば、このような最適化をすることは許されないはずです。
domidomi

2019/06/20 12:44

いつもありがとうございます。 付加情報も非常に納得いたしました。
guest

0

スコープ外の変数を取得することは出来ません
(取得する裏技があったら、スコープの意味がありません)

JavaScript

1function fn(n) { 2 var cnt = n; 3 return function() { 4 return ++cnt; 5 } 6}

変数 cnt は「関数 fn 内」及び「関数 fn の内部関数」のみにスコープがあります。

Re: domidomi さん

投稿2019/06/20 11:51

編集2019/06/20 11:58
think49

総合スコア18162

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

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

0

変化球っぽいですがオブジェクトとして返してあげれば良いのでは?

js

1function fn(n) { 2 var cnt = n; 3 return function () { 4 ++cnt; 5 return {cnt} 6 } 7} 8var f = fn(0); 9console.log(f()); // { cnt: 1 } 10console.log(f()); //{ cnt: 2 } 11console.log(Object.keys(f())); //[ 'cnt' ]

投稿2019/06/20 11:04

oikashinoa

総合スコア2826

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

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

0

なんか不毛なことをやっているような気がします

javascript

1const fn=(...n)=>()=>++n[0]; 2const f=fn(0); 3console.log(f()) // 1

みたいな話ですよね?
nが"n"であることは調べられないし、そもそもアクセスもできないのでは?

投稿2019/06/20 07:35

yambejp

総合スコア114779

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

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

0

クラス化する、インスタンス化する等はあります。

ただ、どうしてもクロージャで行いたいという要望の場合、隠ぺいが目的かと思いますので、取得とカウントする処理の関数各々かえせばいいんじゃないでしょうか。

javascript

1function fn(n) { 2 var cnt = n; 3 return { 4 up:function(){return ++cnt;}, 5 state:function(){ return cnt;} 6 } 7} 8var f = fn(0); 9f.up() // 1 10f.state() // 1

投稿2019/06/20 07:07

kanimaru

総合スコア1013

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

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

hentaiman

2019/06/20 07:09

変数名を取得したいと言っているのでそれは違うような気がします
kanimaru

2019/06/20 07:17

hentaimanさん 確かに質問文を読み落としておりました。わざわざ変数名を取得したいという事であれば、上記は不可能ですね。 どうしても行居た場合は、オブジェクト定義してKEY取るかの実装になるかと思います。 また、差し出がましくはありますが、hentaimanさんの回答につきましても私見をコメントさせて頂きました。
guest

0

varで定義したものを取得する方法は知らないけど、thisならfnオブジェクトに属するものって事で取れます。

1 function fn(n) { 2 var cnt = n; 3 this.cnt2= n; 4 return function() { 5 //return ++cnt; 6 return this; 7 } 8 } 9 var f = fn(0); 10 f() // 1 11 console.log(f());

投稿2019/06/20 07:02

hentaiman

総合スコア6415

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

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

kanimaru

2019/06/20 07:19

本回答ブラウザ環境で動作させますと、戻り値がwindowになるかと存じます。 その場合、私の回答と同じくクロージャ内で指定している変数名「cnt」は取得できないかと存じます。
domidomi

2019/06/20 07:25

ありがとうございます。 fn自体をカスタマイズしない場合はどうでしょうか?
hentaiman

2019/06/20 07:29

> kanimaruさん 試しに動作させてみてください。変数名以外の余分な情報がいらねーよって意味合いだったら納得ですが。 >domidomiさん fn自体をカスタマイズしないってのがどういう意味か分からないので、カスタマイズしない場合のコードというものを質問文に追記してもらっても良いですか?
macaron_xxx

2019/06/20 07:42

これじゃカウンタにすらなってないという…
hentaiman

2019/06/20 07:43

サンプルコードはそうだけど、質問はカウンターの話じゃないでしょ?
macaron_xxx

2019/06/20 07:56

それは本末転倒な話です。 「質問の意図は、クロージャがカウントアップして値を返してくるんだけど、 それを保持している変数名と現在値を取得したいんだけど。」 という話でしょう。 クロージャがthisを返して、thisの中にcnt2ありますよーじゃ回答として不適切でしょう。
hentaiman

2019/06/20 08:06

そうですか。クロージャーの例でカウンターを使う事はままある話だと思うんですけどね。 あなたから見れば質問者のレベルは低く感じた為に不適切な回答と思えたのでしょうが、自分からすれば質問者にはこの回答で十分理解してもらえるぐらいの知識があると思って回答したまでです。 ま、カウンターを作りたいんですよーって明確に追記でもされるようならその辺は書き直しますよ笑
退会済みユーザー

退会済みユーザー

2019/06/20 17:10 編集

失礼致します。上記のコード実行してみたのですが、「ストリクトモード」「非ストリクトモード」両方において、 `console.log( f() ) // 1` となりませんでした。 ((非ストリクトモード)) `console.log( f() === window ) // true` ((ストリクトモード)) `TypeError: undefined is not an object (evaluating 'this.cnt2= n')` となりました。 私も曖昧な部分があり、これを機に再度`this`についてまとめてみました???? 以下お時間があり、お付き合い頂ければ幸いです。ご迷惑に感じられましたらすみません。スルーされるかお叱り下さいませ(。•ㅅ•。)???? ### this の値 ### |         |    non-strict    |   strict   | | 文脈      |             |         | |==============|======================|==============| | グローバル文脈 |     window     | window | | -------------------|----------------------------|------------------| |  関数文脈   |     (1) 実行文脈オブジェクトによる   | | -------------------|------------------------------------------------| ## (1) 関数文脈における、実行文脈オブジェクト |               | non-strict  | strict | | 実行文脈オブジェクト    |       |      | |==========================|==========|========| | 決定されていない      |  window  | undefined | |--------------------------------|-----------------------------| | 決定されている       |      (2)      | |--------------------------------|-----------------------------| # (2) 決定されている場合 ## `this`の値の決定され方 ### 明示的に決定する場合 - bind/call/apply - arrow function ### 呼び出され方で決定される(暗示的)場合 - object method - constructor function - event handler 非ストリクトモード、 `this`の文脈オブジェクトが未定義、 グローバル文脈、関数文脈どちらにおいても、`this`の値はグローバルオブジェクト(windowオブジェクト)になります。 `this`の実行文脈物体は未定義ですので、先の表より、 ### 非ストリクトモード ### `this === window` であり`f() // 1` とはなりません。 又、`this.cnt = 2` === `window.cnt = 2` であり、グローバル名前空間を汚すことになり、推奨されえないと存じます。 ### ストリクトモード ### `this === "undefined"` となります。 メソッド・コンストラクタ・bind/call/apply・イベントハンドラにおいて`this`は有効ですが、通常関数として単純に呼び出した場合、`this`は未定義になります。 モードがとちらであるにせよ、通常関数として単純に呼び出す際は、`this`は有効ではない様に思いました。 私もまだまだ若輩者であり、hentaimanさんの意図と違いましたらすみません。又、間違い等ありましたらすみません。その際は指摘して頂けると助かります<(_ _)>????
hentaiman

2019/06/20 17:11 編集

> AzumaOさん 指摘ありがとう。長いから最初の方と最後の方しか読んでないけどちゃんとコメントくれてそうなので自分でコードちゃんと書いて試しました。 というか書いてる途中で気付いたけど、この回答間違ってます。業務でこんな書き方した事無かったわ・・・。 真面目な質問者さんには誤った知識に触れさせる結果になって申し訳ない事をしてしまった・・・。 良かったらAzumaOさんもマイナス押しといてください
退会済みユーザー

退会済みユーザー

2019/06/20 17:23

怒られリプが来るかと思って少しドキドキしました(; ・`д・´)????w 長過ぎてすみません( ˟ ⌑ ˟ )???? 気を付けていても間違ってしまいますよね(;◔ิд◔ิ)????(心辺り????)間違った時は修正すれば万事おけけです٩(⁼̴̀ꇴ⁼̴́٩)♪✨♪♪ あ、その…既に押してしまいました????????w 僕の回答も…、そしてマイナスもうひと伸びいきそうです…(;◔ิд◔ิ)????w
hentaiman

2019/06/20 17:38

回答に対して適切なコメント書いてくれてる人に怒る理由は特にないですね。 AzumaOさんは指摘して怒られた事あるんですか?もしあるのなら指摘が回答に合ってないか、指摘で書いた文面が余程非常識だったか、回答者が意地っ張りだったために指摘されたカッと来たかのいずれかでしょうね。 自分の場合は悪意あって誤った回答をする事は無いものの、業務では無いのでサラッと回答してるだけだから間違ってる事も多いかもしんないです。そん時はまた指摘してください。 以前に他の回答者に調査して正確に回答するか注釈入れろって言われた事あるけど、無償でそこまでしねーよって感じなので。 teratailは暇つぶしでヘルプする側に立ってるだけなので。
退会済みユーザー

退会済みユーザー

2019/06/21 04:29

色々了解致しました????????
Zuishin

2019/06/21 06:59

この質問者は自分から指摘してくれと言ったのに実際指摘すると怒って取り下げる人のようです。 要するに自分を基準に判断して「怒られる」と思ったんですね。
hentaiman

2019/06/21 07:08 編集

質問者ってのはコメントした人(AzumaOさん)のことですか?それとも回答者(hentaiman)の事ですか? AzumaOさんが指摘してくれと言ってるかどうかは知りませんが、AzumaOさんに関しての事ならすいませんが回答とかほとんど読んでません。サッと見た感じ変な言葉ばっかりで読みにくかったので。 hentaimanの事なら、少なくとも回答から逸れた話題にならない限りはとりあえず普通の対応か多少hentaiな対応するぐらいです。
Zuishin

2019/06/21 07:11

間違えました。質問者ではありませんでした。コメントした人(AzumaO)のことです。
Zuishin

2019/06/21 07:11

質問者さん、hentaiman さんすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問