2017-02-17 54 views
3
foo(x, y = function() { x = 2; }) { 
    var x = 3; 
    y(); 
    console.warn(x); 
} 

foo(); 

爲什麼foo()在react-native中輸出2,但Chrome控制檯輸出3?爲什麼foo()輸出2反應原生,但Chrome控制檯輸出3?

+0

的示例代碼缺乏函數聲明。如果只是簡單地粘貼,這段代碼將在Chrome中產生一個語法錯誤,而不是3.但是,如果添加了一個聲明,代碼的確在Chrome中產生3。如果我是一個Javascript引擎,我也會在這裏輸出3 :) –

+0

理想情況下,它應該將'3'打印爲匿名函數中的'x'將指向參數'x'而不是變量'x'。 – Rajesh

+0

在react-native中,不應寫入函數。 – Yan

回答

4

陣營本地的,默認情況下,編譯代碼ES2015這樣的代碼實際運行應該是類似於:

function foo(x) { 
    var y = arguments.length > 1 && arguments[1] || function() { 
    x = 2; 
    } 
    var x = 3; 
    y(); 
    console.warn(x); 
} 

所以,當你運行y()引用的xvar x = 3;宣佈x。在實際支持默認參數的Chrome控制檯中,x引用參數中的變量。請參見下面的代碼:

function foo(x, y=function() { console.warn(x); x = 2; }) { 
    var x = 3; 
    y(); 
    console.warn(x); 
} 

當您運行foo(5)你會看到:

5 
3 
+0

變量'x'將被掛起。在當前代碼中,由於'y'在'x'之前定義,'x = 2'將在args中指向'x'。代碼可能看起來像[this](https://jsfiddle.net/RajeshDixit/m8jj8wka/) – Rajesh

+0

你是對的。@ Lucas – Yan

1

的reasion是@Lucas回答。 ES2015不支持默認參數。將本地編譯代碼反饋給ES2015。

foo(x, y=function() { console.warn(z); x = 2; z = 3}) { 
    var x = 3; 
    y(); 
    console.warn(x); 
} 

因此,foo(5)顯示「無法找到變量:z」。

Chrome可以支持默認參數。

function foo(x, y=function() { console.warn(z); x = 2; z = 3 }) { 
    var x = 3; 
    y(); 
    console.warn(x); 
} 

富(5),你會看到:

3 
3