2017-08-09 3 views
0
function makeAdder(x) { 
    return function(y) { 
    return x + y; 
    }; 
} 
var add5 = makeAdder(5); 
add5(2); //7; 
add5(2).__proto__; //0` 

意味があります。しかし、add5(2)はオブジェクトですか?なぜ0がありますか?javascript closure __proto__

+2

あなたは何を意味するのかそこまで?私のchrome開発ツールによると、 '__proto__'はオブジェクトではなく0である。 – lilezek

+0

JSの中のすべて(' undefined'と 'null'を除く)はオブジェクトです。 – jmargolisvt

+0

about:blankを指し示す新しいChromeタブを開き、新しい/クリアコンソールを試してみてください。 add5(2).__ proto__は非ゼロのNumberオブジェクトです。 – ranieribt

答えて

2

私はあなたのコードを実行している環境かわからないが、これはあなたが数値__proto__にアクセスしようとすると何が起こるかです:値が一時的に数オブジェクト(すなわち同等に変換され、 new Number(7)と呼ぶ)。そのオブジェクトのプロトタイプはもちろんNumber.prototypeです。

The spec says

番号プロトタイプはNumberオブジェクト自体です。値が+0の内部スロット[[NumberData]]があります。

私は唯一の環境はあなたがadd5(2).__proto__は、数のオブジェクトであり、その後、0を返すそのvalueOfメソッドを呼び出したことを検出を使用していると仮定することができます

console.log(Number.prototype.valueOf());

+0

ありがとう。関数のパラメータはコンパイル時にjavascriptに表示されますか?私は範囲内でパラメータが変数として作成されることを意味します。 – xin