メソッドを に設定したときにこれが機能しない理由を誰か教えてもらえますconsole.log
か?
var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
var f = this;
$.each(n, function(k, v){
f = f[v];
});
f(msg);
これは私が使ってみたときにうまくいくようですalert
メソッドを に設定したときにこれが機能しない理由を誰か教えてもらえますconsole.log
か?
var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
var f = this;
$.each(n, function(k, v){
f = f[v];
});
f(msg);
これは私が使ってみたときにうまくいくようですalert
これは、コンソールのログ関数がf
変数に割り当てられるためですが、実行されると、コンソールスコープへの参照がなくなります。Javascriptのスコープは、コールバックを処理したり、関数を渡したりするときに注意が必要になる場合があります。
@Muraliのコメントによると、一部のブラウザは他のブラウザとは異なる方法でconsole.logメソッドを実装しています。
実験として、このコードを実行してみて、機能するかどうかを確認してください。
var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
n[1].call(n[0], msg);
この.call
メソッドを使用すると、関数を実行してそのスコープを宣言できます。それがうまくいけば、ループシナリオを簡単にリファクタリングできるはずです。
解決しました。
var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
var tail = n.pop();
var f = this;
$.each(n, function(k, v){
f = f[v];
});
var func = function(){ f[tail].apply(f, arguments); }
func(msg);
これが Chrome、Firefox、Opera、および Safari で動作することをテストしました。IE9では動かないようです。