2016-11-15 13 views
4

JavascriptのThe Good Partsのコードを理解しようとすると、私は奇妙な問題に遭遇しました。console.logはnodejsの関数ではありません。6.9.1

Function.prototype.method=function(name,func){ 
 
    this.prototype[name]=func; 
 
    return this; 
 
} 
 

 
Function.method('bind',function(that){ 
 
    var method=this; 
 
    var slice =Array.prototype.slice; 
 
    var args=slice.apply(arguments,[1]); 
 

 
    console.log(that);//error: console.log is not a function 
 

 
    return function(){ 
 
     return method.apply(that,args.concat(slice.apply(arguments,[0]))); 
 
    }; 
 
}); 
 

 
var x=function(){ 
 
    return this.value; 
 
}.bind({value:666}); 
 

 
console.log(x());

とエラーメッセージが打撃です::私は何かを印刷するにconsole.log()を使用しようが、私はちょうどTypeError例外を取得し、私のコードはここにある

/home/wz/code/js/c.js:14 
    console.log(that);//error: console.log is not a function 
      ^

TypeError: console.log is not a function 
    at Function.<anonymous> (/home/wz/code/js/c.js:14:13) 
    at new Console (console.js:34:23) 
    at console.js:100:18 
    at NativeModule.compile (bootstrap_node.js:497:7) 
    at Function.NativeModule.require (bootstrap_node.js:438:18) 
    at get (bootstrap_node.js:254:34) 
    at Function.<anonymous> (/home/wz/code/js/c.js:14:5) 
    at Object.<anonymous> (/home/wz/code/js/c.js:23:3) 
    at Module._compile (module.js:570:32) 
    at Object.Module._extensions..js (module.js:579:10) 

Shell 已返回1 

それは私が期待どおりに動作するstackoverflowでスニペットを実行するととても面白いです...私の母国の環境にいくつかのバグがあるようですか?

私は実際にそれは私のコードであり、私は、コードを変更するかを確認するためにファイルにはconsole.logを保存するためにFSを使用しよう:

fs=require('fs'); 
Function.prototype.method=function(name,func){ 
    this.prototype[name]=func; 
    return this; 
} 

Function.method('bind',function(that){ 
    var method=this; 
    var slice =Array.prototype.slice; 
    var args=slice.apply(arguments,[1]); 

    fs.writeFile('a.txt',String(console.log)); 
    //console.log(that);//error: console.log is not a function 

    return function(){ 
     return method.apply(that,args.concat(slice.apply(arguments,[0]))); 
    }; 
}); 

var x=function(){ 
    return this.value; 
}.bind({value:666}); 

console.log(x()); 

とA.TXTで:

function(){ 
     return method.apply(that,args.concat(slice.apply(arguments,[0]))); 
    } 

驚くべきことに、console.logは返されたオブジェクトになります...私は完全に混乱しました。 ノード6.9.1と4.6.1を試しましたが、同じ結果が得られました。そして、ノードのバージョンを管理するためにnvmを使用します。

+1

ちょうど注記:node.js内でこのように 'bind'をpolyfillする必要はありません。ネイティブでサポートしています。 –

+0

'console'自体の価値は何ですか? – damd

+0

@damd console.logをconsoleに変更し、a.txtに「object object」があります。 – wangzhe

答えて

-1

あなたのコードのどこかでconsoleを上書きします。避けるためにMonkey patchingあなたが建設し使用することができます。この構成により

console.log = console.log || function(message) { alert(message);};

をあなただけの新しい方法や礼儀を追加し、既存の機能を上書きしません。

+0

しかし、私の全体のコードは上記です、私はコンソールをオーバーライドしませんでした。また、外部スコープのconsole.logは正常に動作します。 – wangzhe

関連する問題