0

次のコード例があります。

Application.Polyfills.prototype.prettifyCode = function(enable, js_lib, css_lib) {
    return Modernizr.load([{
        test : enable,
        yep : [ css_lib, js_lib ],
        complete: function() {
            return window.prettyPrint && prettyPrint();
        }
    }]);
};

console.log(typeof this.prettifyCode)this参照するを実行すると がApplication.Polyfills得られますfunctionが、実行するconsole.log(typeof this.prettifyCode())と が得られundefinedます。ほとんどの場合、関数には引数が必要なため、括弧を使用する必要があるため、どちらの場合でも同じ結果が得られるように、なぜそれが得られるのか、どうすれば修正できるのか教えてもらえますか?

より具体的には、メソッドがあります:

Application.Polyfills.prototype.callPolyfills = function(array) {
    for (var i = array.length - 1; i >= 0; i--) {
        console.log(typeof array[i]);
        (typeof array[i] === "function") ? array[i].apply(this, [ this ]) : console.log('Index [' + i + ']: Invalid [ Function Required ]') ;
    };
};

上記のメソッドは、次のような配列内に配置されたすべての関数を呼び出すために使用されます。

this.callPolyfills([
        self.polyfillize([
            {
                test : [Modernizr.localstorage, Modernizr.sessionstorage],
                polyfill : [self.polyfills_url.storage_polyfill_url]
            },
            {
                test : [Modernizr.json],
                polyfill : [self.polyfills_url.json_polyfill_url]
            }
        ]),
        self.prettifyCode(self.prettify, self.libraries_url.google_code_prettyfier.css, self.libraries_url.google_code_prettyfier.js),
        self.consoleAvoidError()
    ]);

そこにある不明なすべての変数を抽象化して、その配列で呼び出すものが実際に関数であるかどうかを確認したいと思います。メソッドで既にチェックしようとしていcallPolyfillsます。undefinedでも関数なのに毎回返すので失敗。

4

3 に答える 3

4

typeof this.prettifyCode()this.prettifyCode();によって返される値のタイプをチェックしています。これはundefinedです。

typeof this.prettifyCodeただし、prettifyCodeメンバーのタイプが何であるかを確認してthisいます。これはfunction

これらを同じにしたくないはずです。それらが同じである可能性がある唯一の方法は、関数が返される場合ですが、とがthis.prettifyCode両方であるという事実は無意味です。typeof this.prettifyCode()typeof this.prettifyCodefunction

于 2013-01-06T14:47:09.407 に答える
1

callPolyfills 内で明示的にポリフィルを呼び出す代わりに、アプローチを変更できますか? このような:

this.callPolyfills([
    [self.polyfillize, [
        {
            test : [Modernizr.localstorage, Modernizr.sessionstorage],
            polyfill : [self.polyfills_url.storage_polyfill_url]
        },
        {
            test : [Modernizr.json],
            polyfill : [self.polyfills_url.json_polyfill_url]
        }
    ]],
    [self.prettifyCodeself.prettify, self.libraries_url.google_code_prettyfier.css, self.libraries_url.google_code_prettyfier.js],
    self.consoleAvoidError
]);

したがって、次のように確認します。

Application.Polyfills.prototype.callPolyfills = function(array) {
    for (var i = array.length - 1; i >= 0; i--) {
        if (typeof array[i] == "function") {
            // call with no arguments
            array[i].apply(this);
        }
        else if (typeof array[i].shift() == "function") {
            // call with arguments
            array[i].apply(this, array[i]);
        }
        else {
            // Invalid [ Function Required ]') ;
        }
    };
};
于 2013-01-06T15:15:13.393 に答える
1

2つの回答はまったく関連していないため、これを新しい回答として追加します


あなたの機能callPolyfillsは的を射ています。それが問題です(関数自体ではなく、呼び出したくない関数の結果callPolyfillsの配列を渡しています)。

function foo() {
    return "hi";
};

var bar = foo; // stores a reference to the function foo in `bar`, but doesn't call foo.
var baz = foo(); // calls foo and stores the result of the function ("hi") in baz.

あなたがやっていること(selfthis、および紛らわしい引数は別として):

callPolyfills([
    foo(),
    foo(),
    foo()
]);

callPolyfills...つまり、実際に必要なものを渡すことなく、何度も「こんにちは」と言います。

あなたが渡すべきものは次のとおりです。

callPolyfills([
    foo,
    foo,
    foo
]);

ただし、これにより、関数に引数を指定できなくなります。この状況でこれを行う最も簡単な方法は、これらの関数を無名関数でラップすることです。

this.callPolyfills([
  function () { 
    self.polyfillize([{
      test: [Modernizr.localstorage, Modernizr.sessionstorage],
      polyfill: [self.polyfills_url.storage_polyfill_url]
    }, {
      test: [Modernizr.json],
      polyfill: [self.polyfills_url.json_polyfill_url]
    }]);
  }, function () {
    self.prettifyCode(self.prettify, self.libraries_url.google_code_prettyfier.css, self.libraries_url.google_code_prettyfier.js);
  },
  self.consoleAvoidError
]);

...しかし、あなたが本当に得ているものはわかりません。

于 2013-01-06T15:12:04.500 に答える