2017-08-09 26 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對象;它有一個[[NumberData]]內部插槽,其值爲+0。

我只能假設環境使用的是檢測該add5(2).__proto__是一些對象,並調用其valueOf方法,然後返回0

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

+0

謝謝。在編譯器時間內,javascript中的參數是否可見?我的意思是在範圍內參數被創建爲一個變量。 – xin