>  기사  >  백엔드 개발  >  자바스크립트 범위 문제

자바스크립트 범위 문제

WBOY
WBOY원래의
2016-12-01 00:56:32845검색

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는 동시에 값을 가리키며, 이 경우 길이가 2인 배열입니다. 따라서 변수에 대해 푸시 또는 기타 작업을 수행할 때 실제로 변경되는 것은 두 변수가 동시에 가리키는 값입니다.

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으로 문의하세요.