2016-09-28 4 views
1

Это очень простой вопрос, но по какой-то причине я борюсь и не могу найти хорошую ссылку на него.Как повлиять на объект строки, переданный функции

Скажем, у меня есть этот JScript код работает под WSH:

function func(myStr) { 
    var res = "abc"; 
    myStr = res; 
} 

function main() { 
    var myStr = new String(); 

    WScript.Echo(myStr); 
    func(myStr); 
    WScript.Echo(myStr); 
} 

main(); 

Я проходящее String объект func и ожидать func установить значение объекта. Однако func использует operator =, который копирует контент, но генерирует новое задание

Я рассмотрел этот пост, How do I correctly clone a JavaScript object? и не смог найти то, что искал.

Есть ли у нас простое, прямое решение?

+0

JavaScript имеет довольно смутное представление объектных указателей и т.д., называют ссылочной программирования является довольно сложным – K3v1n

+0

Я обновил код, чтобы подчеркнуть что 'myStr' не является глобальным и не может рассматриваться таким образом в' func' – idanshmu

+0

@ K3v1n, это настолько странно, что вам придется работать так. Я разработчик C++, и этот вариант использования так же распространен, как может быть. Если 'myStr' был объекта типа или массива, который не был бы проблемой. – idanshmu

ответ

1

Главное является: объекты передаются по ссылке. Другие вещи, такие как строки, массивы, числа, ... передаются по значению.

Каждый раз, когда вы передаете строку функции, только одна копия ее значения передается этой функции (поэтому не считайте, что ваш строковый объект является объектом, не спрашивайте о клонировании.). Но любая ссылка на исходную переменную теряется.

Объекты, с другой стороны, когда вы передаете их функции, адрес (указатель/ссылка) объекта передается функции, поэтому он представляет собой ту же переменную, что и внутри. Таким образом, все, что происходит с этим объектом внутри функции, будет влиять на объект снаружи (также).

Теперь посмотрим на подобный код, но с прохождением объектов

var myObject = {}; 
myObject.txt = 'Foo'; 
console.log(myObject.txt); 
func(myObject); 
console.log(myObject.txt); 

function func(obj) { 
    obj.txt = 'Hello World'; 
} 
1

Вы можете сделать это 2 способами

Возвращение значения из func, как

var myStr = new String(); 
    myStr = func(); 

Где func потребность в обновлении, чтобы вернуть значение (return res)

Или вы могли бы использовать объект но вам нужно будет изменить некоторые вещи

function func(myStr) { 
    var res = "abc"; 
    myStr.value = res; 
} 

function main() { 
    var myStr = {}; 

    WScript.Echo(myStr.value); 
    func(myStr); 
    WScript.Echo(myStr.value); 
} 

main(); 

Таким образом, ваш myStr является ссылкой на этот объект. Я бы посоветовал вам прочитать JS Objects.

Некоторые ссылки:
http://eloquentjavascript.net/06_object.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects