변하지 않는 변수의 참조를 함수의 인수로 전달할 수 있습니까?
예:
var x = 0;
function a(x)
{
x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
답변
JavaScript는 참조에 의한 매개 변수 전달을 지원하지 않으므로 대신 변수를 객체로 만들어야합니다.
var x = {Value: 0};
function a(obj)
{
obj.Value++;
}
a(x);
document.write(x.Value); //Here i want to have 1 instead of 0
이 경우 x
는 객체에 대한 참조입니다. x
함수에가 전달 되면 a
해당 참조가로 복사됩니다 obj
. 따라서, obj
및 x
메모리에 같은 일을 참조하십시오. 변화 Value
의 특성은 obj
에 영향을 미치는 Value
의 속성을 x
.
Javascript는 항상 값으로 함수 매개 변수를 전달합니다. 이것은 단순히 언어의 사양입니다. 당신은 할 수 만들 x
두 기능의 로컬 범위에서, 모든에 변수를 전달하지.
답변
이 질문이 도움이 될 수 있습니다 :
자바 스크립트에서 참조로 변수를 전달하는 방법? 둘 이상의 값을 반환하는 ActiveX 함수에서 데이터 읽기
요약하자면 Javascript 기본 유형은 항상 값으로 전달되는 반면 객체 내부의 값은 참조로 전달됩니다 (내 감독을 지적한 주석가에게 감사). 따라서이 문제를 해결하려면 정수를 객체 안에 넣어야합니다.
var myobj = {x:0};
function a(obj)
{
obj.x++;
}
a(myobj);
alert(myobj.x); // returns 1
답변
C 관점에서 더 일반적이고 이해하기 쉬운 포인터를 구현하는 약간 다른 방법을 발견했습니다 (따라서 사용자 예제의 형식에 더 적합).
C에서와 같이 JavaScript에서 배열 변수는 실제로 배열에 대한 포인터 일 뿐이므로 포인터를 선언하는 것과 똑같이 배열을 사용할 수 있습니다. 이렇게하면 원래 개체에서 변수의 이름을 지정 했음에도 불구하고 코드의 모든 포인터를 동일한 방식으로 사용할 수 있습니다.
또한 포인터의 주소와 포인터의 주소를 가리키는 두 가지 다른 표기법을 사용할 수 있습니다.
다음은 예입니다 (밑줄을 사용하여 포인터를 나타냄).
var _x = [ 10 ];
function foo(_a){
_a[0] += 10;
}
foo(_x);
console.log(_x[0]);
수율
output: 20
답변
창 개체에서 ‘x’를 참조합니다.
var x = 0;
function a(key, ref) {
ref = ref || window; // object reference - default window
ref[key]++;
}
a('x'); // string
alert(x);
답변
늦게 대답했지만 클로저를 통해 참조로 원시 값을 전달하는 방법을 발견했습니다. 포인터를 만드는 것은 다소 복잡하지만 작동합니다.
function ptr(get, set) {
return { get: get, set: set };
}
function helloWorld(namePtr) {
console.log(namePtr.get());
namePtr.set('jack');
console.log(namePtr.get())
}
var myName = 'joe';
var myNamePtr = ptr(
function () { return myName; },
function (value) { myName = value; }
);
helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack
ES6에서는 람다 식을 사용하도록 코드를 줄일 수 있습니다.
var myName = 'joe';
var myNamePtr = ptr(=> myName, v => myName = v);
helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack
답변
JavaScript에서 그것은 글로벌이 될 것입니다. 그러나 함수는 다음과 유사합니다.
function a(){
x++;
};
이후 x
글로벌 맥락에서, 당신은 함수에 전달할 필요가 없습니다.
답변
Javascript는 많은 문제를 해결하는 믹스 코즈에 포인터를 넣어야합니다. 이는 코드가 동적으로 생성 된 알 수없는 변수 이름 또는 변수를 참조 할 수 있음을 의미합니다. 또한 모듈 식 코딩과 삽입을 쉽게 할 수 있습니다.
이것은 실제로 c 포인터에 가장 가깝다고 생각하는 것입니다.
js에서 :
var a = 78; // creates a var with integer value of 78
var pointer = 'a' // note it is a string representation of the var name
eval (pointer + ' = 12'); // equivalent to: eval ('a = 12'); but changes value of a to 12
c에서 :
int a = 78; // creates a var with integer value of 78
int pointer = &a; // makes pointer to refer to the same address mem as a
*pointer = 12; // changes the value of a to 12