23

私は持っています:

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

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

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

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

4

6 に答える 6

56

関数ではありません。

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

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

検討:

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

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

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


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

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

割り当てが割り当てられた値に評価されるという事実を利用する、CD Sanchez(コメントを参照)からの別の解決策(はるかに短い/よりクリーンな)は次のとおりです。

var Init; (Init = function Init () {
  alert ("wee");
})()
于 2011-05-22T21:33:24.173 に答える
2

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

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

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

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

于 2011-05-22T21:32:53.570 に答える
2

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

var Init = (function() {

    // some code

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

}());
于 2011-05-22T21:35:34.733 に答える
1

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

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

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

于 2011-05-22T21:33:59.930 に答える
1

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

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

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

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

于 2012-08-16T21:05:49.697 に答える
0

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

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

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

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

var Init = function(){
    /*...*/
    },
    initResult = (function(){ return Init(); })();
于 2011-05-22T21:38:16.650 に答える