Javascript「Uncaught TypeError:object is not a function」連想の質問


92

コードは次のとおりです。

<body>
    <a href="javascript:;" id="test">hello</a>
</body>

<script type="text/javascript">
    document.getElementById("test").addEventListener("click", function () {
      test()
    }, false)
    function test() {
      var postTypes = new Array('hello', 'there')   
      (function() { alert('hello there') })()
    }
</script>

これはスローされます:

「キャッチされていないTypeError:オブジェクトは関数ではありません」

匿名関数呼び出し/呼び出しを別の括弧のセットでラップすると、アラートが実行されますが、それでもエラーが発生します。「var postTypes」の定義の後にセミコロンを付けると、完全にうまくいきます。

私はJavaScriptがセミコロンを必要としないと信じさせられたので、私は完全に理解していない関数適用のいくつかの奇妙な連想ルールがあると推測しています。このエラーが発生するのはなぜですか?


匿名関数と静的関数の両方を作成しようとしていて、1つの関数として実行されることを期待しているように見えます。function()を削除するとどうなりますか
brumScouse

回答:


85

JavaScriptはセミコロンを必要としますが、可能な場合はインタープリターが改行時にセミコロンを挿入するだけです*

残念ながら、コード

var a = new B(args)(stuff)()

構文エラーは発生しないため、;挿入されません。(実行できる例は

var answer = new Function("x", "return x")(function(){return 42;})();

このような驚きを避けるために、常にでステートメントを終了するようにトレーニングしてください;


*これは経験則に過ぎず、常に正しいとは限りません。挿入ルールははるかに複雑です。セミコロンの挿入に関するこのブログページには、より詳細があります。


13
または:このような驚きを避けるために、きれいに読み取り可能なコード(常に適用されるはずです)を書くようにトレーニングし、一般的なASIルールを知ってください。

18

コードで自動セミコロン挿入(ASI)プロセスが発生しない場合が発生します。

ASIに依存することはできません。ステートメントを適切に区切るには、セミコロンを使用する必要があります。

var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!

(function() { alert('hello there') })();

あなたのコードは実際に配列オブジェクトを呼び出そうとしていました。


この問題を解決する方法の1つですが、クロックフォードクラブに遅れをとることはできません。

1
@pst:私はCrock'sクラブではないんだけど、私は言い換えるてみましょうすべての :)
クリスチャンC.Salvadó

その場合、私は厳しい言葉をお詫びします:(

私はクイズを楽しんだ。ASIは確かにicky-codeとひどく混乱しています!

8

同様のエラーが発生し、私の場合、配列変数にpayInvoicesという名前を付け、関数にもpayInvoicesを指定したことを認識するのにしばらく時間がかかりました。AngularJsを混乱させました。名前をprocessPayments()に変更すると、最終的に機能しました。これを理解するのに長い時間がかかったので、このエラーと解決策を共有したかっただけです。


ここでも同じ名前の変数がalertあり、JavaScriptアラート関数を呼び出そうとしていて、「アラートは関数ではない」と表示されます。alert実際の関数の代わりに変数を呼び出そうとしていました
James111

0

JavaScriptファイルで関数を呼び出す前に、関数本体を作成してください。


0

これと同じエラーが発生し、1日半かけて解決策を見つけました。ナオミの答えは私が必要とする解決策へと導いてくれました。

私の入力(type = button)にはname、onClickイベントによって呼び出されている関数名と同じ属性がありました。属性を変更すると、nameすべてが機能しました。

<input type="button" name="clearEmployer" onClick="clearEmployer();">

に変更:

<input type="button" name="clearEmployerBtn" onClick="clearEmployer();">

0

TSをWebPackでコンパイルおよびバンドルすると、このエラーが発生します。カンマがないためにコンパイルexport class AppRouterElement extends connect(store, LitElement){....}let Sr = class extends (Object(wr.connect) (fn, vr)) {....}間違っているように見えます。Rollupとバンドルしても、エラーは発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.