web-dev-qa-db-ja.com

Javascript自己実行関数は「関数ではありません」

私が持っています:

var Init = (function() {
   my js goes here
})();

そして、ページがロードされると、私のjsは正しく実行されます。私も持っています:

$('form :checkbox').change(function() {
   Init();
});

しかし、firebugは、Initは関数ではないと言います。

22
Phillip Senn

それは機能ではありません。

(function() {
   ...
})()

匿名関数を評価します。そして評価の結果は明らかに関数オブジェクトを返さないこの場合:-)

考えてみましょう:

f = (function() {
   return "not a function :("
})()
alert(f())

そして

f = (function() {
   return function () { return "Yay!" }
})()
alert(f())

ハッピーコーディング:)


これは、「何かを1回実行」してから、「その何かを返して後で実行する」関数です。 ( "関数を[割り当てる]か呼び出すことができます。両方を行うことはできません..."Slaksの回答を参照してください。)ただし、私はこのようにはしません。

Init = (function () {
  function Init () {
    alert("whee!")
  }
  Init()
  return Init
})()
Init()

これは、割り当てが割り当てられた値に評価されるという事実を利用する、CD Sanchez(コメントを参照)からの別のソリューション(はるかに短い/よりクリーン)です:

var Init; (Init = function Init () {
  alert ("wee");
})()
55
user166390

Initは関数ではありません。これは、関数を呼び出した結果です。

関数を作成するか、呼び出すことができます。両方を同時に行うことはできません。

技術的には、return arguments.callee;を追加して呼び出しから関数を返すことで、これを修正できます。
しかし、それはばかげた考えです。

おそらく関数を呼び出すべきではありません。コードに何をさせたいかを理解する必要があります。

2
SLaks

Initを関数として実行するには、自己実行関数内のコードが関数を返す必要があります。これを行う唯一の理由は、一部のデータ状態に動的に依存する特定の関数を作成する必要がある場合です。 :

var Init = (function() {

    // some code

    return function () {
        // some dynamic code dependent upon your previous code
    };

}());
2
mVChr

上記のようにすることもできますが、

function Init(){...}(); 

名前付きの自己実行関数を持つことを妨げるものは何もありません。 Initという名前の関数を使用したくない場合は、CD Sanchezが提案したように実行し、実行時に割り当てることができます。

();最後にそれを自己実行させます。関数を括弧で囲むと、匿名になります。しかし、あなたはそれを匿名にしたくないようです。

1
fijiaaron

クイックワンこのように交換してみてください

var Init = function() {
   my js goes here
});

読み込み時にInitを呼び出します

1
Rizwan Sharif

次のように宣言してみてください。

(function Init(){ 
    /*...*/ 
})();

しかし、これはその本体へのこの関数の使用を減らします

他の方法は、宣言を実行から分離することです。

var Init = function(){
    /*...*/
    },
    initResult = (function(){ return Init(); })();
0