javascript - JavaScript関数のコンテキストが正しくない

原文 javascript

私はJavaScriptで奇妙なことに気づきました。以下を検討してください:

var fn = ''.toUpperCase.call
console.log(typeof fn); // "function"
fn(); // Uncaught TypeError: `fn` is not a function


上記は私のChromeのデベロッパーコンソールで実行されました。バージョンは43.0.2357.81 mです。

typeof演算子は、fnが関数であることを明確に示していますが、エラーはそれ以外を示唆しています。

Function.applyが少なくともいくつかの意味のあるエラーメッセージを表示していることに気づきました。

では、関数ではなく関数はいつですか?
答え
JavaScriptのコンテキストは、常に関数を呼び出す方法で確立されます。

var fn = ''.toUpperCase.call


これにより、call関数のプロトタイプ実装がfnに割り当てられます。ここでfn()を呼び出した場合、呼び出しにコンテキストはありません。 callは、関連付けられている関数オブジェクトを呼び出そうとします。ただし、そのコンテキストは呼び出し時に確立されます。呼び出し時にコンテキストを提供していないため、callの一部の内部コンポーネントがエラーをスローしています。

これを行う必要があります:

fn.call(''.toUpperCase)


そうです、call関数をcallして、コンテキスト、つまりtoUpperCase文字列関数を確立します。この特定のケースでは、特定のコンテキストにバインドされていないため、toUpperCase内で別のエラーが発生します。そのコンテキストを明示的に確立する必要もあります:

var fn = ''.toUpperCase.call
fn.call(''.toUpperCase.bind(''))


How does the "this" keyword work?も参照してください
関連記事

javascript - 自動インクリメントされたビルド番号をMeteorアプリに追加しますか?

javascript - 遅延ではなくプロミスを保存するにはどうすればよいですか?

javascript - ファイルのアップロード時の415(サポートされていないメディアタイプ)

java - xPathを指定すると、JavaFX webViewの要素を強調表示することは可能ですか?

javascript - 警告ボックスのスタイルを変更するには?

javascript - データベースからリストビューにjsonとphpを入力する

javascript - Angular JSフィルターが予期せず機能しますか?

javascript - mvcビューでアクション結果にリダイレクトするにはどうすればよいですか

javascript - 同じ関数でjqueryの異なるレベルのネストされたJSON値にアクセスする

javascript - 透明なHTML / CSSボタンから見えない?