foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.warn(x);
}
foo();
爲什麼foo()在react-native中輸出2,但Chrome控制檯輸出3?爲什麼foo()輸出2反應原生,但Chrome控制檯輸出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?
陣營本地的,默認情況下,編譯代碼ES2015這樣的代碼實際運行應該是類似於:
function foo(x) {
var y = arguments.length > 1 && arguments[1] || function() {
x = 2;
}
var x = 3;
y();
console.warn(x);
}
所以,當你運行y()
引用的x
是var 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
的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
的示例代碼缺乏函數聲明。如果只是簡單地粘貼,這段代碼將在Chrome中產生一個語法錯誤,而不是3.但是,如果添加了一個聲明,代碼的確在Chrome中產生3。如果我是一個Javascript引擎,我也會在這裏輸出3 :) –
理想情況下,它應該將'3'打印爲匿名函數中的'x'將指向參數'x'而不是變量'x'。 – Rajesh
在react-native中,不應寫入函數。 – Yan