2009年12月08日

WSHの各種オブジェクトのメソッドはどうやらfunctionではないらしい

WSH(wscript.exe或いはcscript.exe)と、XULRunnerのjs.exe(或いはxpcshell.exe)でのJavaScript(JScript)実行時の違いを確認したくて、ちょっとしたコードを書いた。

それぞれ文字列出力用メソッドが異なり、以下のようになっている。

WSH
WScript.Echo
XULRunner
print

毎回書き直すのもアホくさいので、以下のように書いてみた。

if(typeof print === 'undefined') { print = WScript.Echo; }

// ここから下にテスト用コード

もはや何の説明も要らない程単純なコード。で、WSH環境で実行してみる。

D:\Documents and Settings\amaisaeta\test_error.js(1, 36) Microsoft JScript 実行時
エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。

あるぇ?

XULRunner環境下では勿論問題ない。36行目といったら、print = WScript.Echo;の部分。意味が分からん。

少し悩んで、WScript.Echo(typeof WScript.Echo);を実行してみた。

unknown

あるぇ?
"object"でも"function"でもなく、unknown?

……確かによく考えてみたら、WSHの各種オブジェクトはActiveXオブジェクトだったような

で、ググってみると、

最速の人の大昔のエントリに書いてあるんですけど、

IEのActiveXObjectっていうのはちょっと特殊で、メソッドなんかがJavaScriptのfunctionではない。

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
alert(typeof xmlhttp.open); // unknown

こうなる。xmlhttp.openはfunctionではなくて謎オブジェクト。

IEでXMLHttpRequestを使えるようにする

つまりunknownってのはメソッドだと思って良いハズ。

という記述を発見
つまりunknownってのはメソッドだと思って良いハズ。とあるが、
"unknown"はメソッド("function")に似て非なるナニモノか
と考えといた方が良いのかもしれない。

つまり、

// if(typeof print === 'undefined') { print = WScript.Echo; }
// これを……
if(typeof print === 'undefined') { print = function(arg) { WScript.Echo(arg); } } // こうする

こうか。
最も、これだと1引数しか渡せない。可変長引数を更に別関数に渡したい時ってどうやれば良いんだろう……?

ActiveXオブジェクトだったような
COMオブジェクトだったかもしれない。どっちでもいいや。
ラベル:WSH JScript javascript
posted by 天井冴太 at 21:52| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。