首頁  >  文章  >  後端開發  >  javascript作用域問題

javascript作用域問題

WBOY
WBOY原創
2016-12-01 00:56:32817瀏覽

PHP代碼:

<code><?php
$key = [1,2];
function add($key){
    array_push($key,'dddss');
    print_r($key);
}
add($key);
print_r($key);</code>

輸出

<code>Array
(
    [0] => 1
    [1] => 2
    [2] => dddss
)
Array
(
    [0] => 1
    [1] => 2
)
</code>

JS代碼:

<code>var $key = [1,2];
function addkey($key){
    let hello = $key;
    hello.push(9)
    console.log(hello)
    console.log($key)
}
addkey($key)
console.log($key)</code>

輸出:

<code>[ 1, 2, 9 ]
[ 1, 2, 9 ]
[ 1, 2, 9 ]       
</code>

我想要的是函數內的處理不影響函數外,也就是類似PHP的結果,也想知道什麼原因

回覆內容:

PHP代碼:

<code><?php
$key = [1,2];
function add($key){
    array_push($key,'dddss');
    print_r($key);
}
add($key);
print_r($key);</code>

輸出

<code>Array
(
    [0] => 1
    [1] => 2
    [2] => dddss
)
Array
(
    [0] => 1
    [1] => 2
)
</code>

JS代碼:

<code>var $key = [1,2];
function addkey($key){
    let hello = $key;
    hello.push(9)
    console.log(hello)
    console.log($key)
}
addkey($key)
console.log($key)</code>

輸出:

<code>[ 1, 2, 9 ]
[ 1, 2, 9 ]
[ 1, 2, 9 ]       
</code>

我想要的是函數內的處理不影響函數外,也就是類似PHP的結果,也想知道什麼原因

let hello = $key.slice();

你的函數參數是一個數組,而數組在js中是按照引用來傳遞的。 。你在函數內部使用let 將一個陣列的引用賦值給另一個變數的時候。實際上,hello和$key都同時指向了一個值,這裡就是length為2的陣列。所以你對任何一個變數做push或其他操作的時候,改變的其實是兩個變數同時指向的那個值。

PHP 預設傳入參數是傳的拷貝,不是引用,但 JS 傳的一直都是引用,所以,只需要在裡面拷貝一個來改就行了

<code class="javascript">var $keys = [1, 2];
function addkey($keys) {
    // 拷贝一份
    let hello = [].concat($keys);
    hello.push(9);
    console.log(hello);
    console.log($keys);
}
addkey($keys);
console.log($keys);</code>

問題在於引用傳值。其實這他會出現在PHP。

<code>$obj = new stdClass();
$obj->name = 'aa';
function change($o) {
    $o->name = 'bb';
}
change($obj);
echo $obj; // 'bb'</code>

不同的地方是js的陣列也是對象,也是引用傳值。 你可以搜尋一下‘克隆對象’。這個問題的答案,上面的回答已經給出。

php 用傳入參數的時候加上& 就是引用傳值了,那就跟你js程式碼跑出來一樣了

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn