2016-05-10 13 views
0

ではありません。私は質問のタイトルで説明したようにareFieldsSet機能を参照してくださいしようとしていたときに今キャッチされない例外TypeError:areFieldsSetは、私のように私のJSコードを持っている機能

$(function() { //line-1 
    if(window.location.search.length >1){ 
    //doSomething ; 
    areFieldsSet(); //call this function 
    } //end of if 

    var areFieldsSet = function(){ 
    //do something 
    } 
    //do many things 
    } // end of line-1 function 

、私はエラーを取得しています。 どこが間違っていますか?

+0

エラーは何ですか?なぜあなたは単純にやろうとしないのですか? 'function areFieldsSet(){...}'? – Alex

+0

@Alex Uncaught TypeError:areFieldsSetは関数ではありません –

+0

@Alexこの関数はコード内の多くの領域から参照されているため、関数ifFieldsSet(){...}は使用できません。 –

答えて

2

問題は、呼び出した後に関数を定義していることです。

JavaScriptは「巻き上げ」と呼ばれるものです。彼らの初期化をVariable and Function Hoisting in JavaScript

ルールは時々混乱することができますが、基本的には暗黙のうちにトップに移動されfunction x()表記を使用して定義機能、および変数定義も同様に移動されますが、ありません:この記事を見てみましょう!

例えば、var x = 5;はコードブロック/機能の開始時にvar x;が書かれたかのように機能しますが、さらに下にx = 5;と書かれています。したがってxは割り当て前に定義されますが、値はundefinedです。だから、

は、次の2つのオプションがあります:あなたはそれを呼び出す場所の上ごareFieldsSet機能を移動したり、あなただけfunction areFieldsSet()それが適格巻き上げ(だけでなく、変数巻き上げ)として機能するようになりますしているvar areFieldsSet = function()からそれを変更するのいずれかを。

1

Javascriptコードは2つのフェーズで動作します。

第1段階 - すべての変数をvarキーワード(宣言のみ、初期化なし)およびすべての関数宣言(関数F(){})で宣言します。

第2段階 - 実行を開始します。あなたのコードで

あなた関数式、ない宣言を持っているので、あなたがラインでその関数を呼び出すようにしようとしているとき

$(function() { //line-1 
    if(window.location.search.length >1){ 
    //doSomething ; 
    areFieldsSet(); //call this function 
    } //end of if 

    var areFieldsSet = function(){ 
    //do something 
    } 
    //do many things 
    } 

JavaScriptエンジンは、名前を持つ変数があることを知っているareFieldsSet(それは第一期で宣言されているため)、それに関数をassingingすると、あなたのコードがそうするとき

var areFieldsSet = function(){ 
     //do something 
     } 

に達成するときにのみ動作しますあなたは関数のように呼び出そうとしていますが、JavaScriptはそれが関数であることを知らないのでエラーが発生します。

関連する問題