2015-06-15 2 views
2

Можно ли отправить ссылку на глобальную переменную функции в JavaScript? This answer говорит «нет», но я не могу поверить, нет обходного пути.Передача ссылки глобальной переменной на функцию

Что я имею в виду, это примерно следующее. Он не работает, но он должен объяснить, что я имею в виду:

var data_1; 
var data_2; 

fillValue(data_1,"First"); 
fillValue(data_2,"Second"); 

function fillValue(link2GlobalVar, value){ 
    link2GlobalVar = value; 
} 

console.log(data_1); 
console.log(data_2); 

Было бы здорово, если бы можно было вывести в консоли

First 
Second 

Вы знаете трюк, чтобы отправить глобальные переменные функции и изменить их внутри них, как это?

См Fiddle

+0

Нравится это -> ** http: //jsfiddle.net/9288bgaq/1/** – adeneo

+0

См. Http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference -or-pass-by-value-language? lq = 1 –

ответ

3

Примитивные значения не передаются по ссылке. Объекты есть.

Если вы заключаете глобалов в объекте, вы будете иметь возможность изменять свои свойства из функции:

var data_1 = {}; 
 
var data_2 = {}; 
 

 

 
fillValue(data_1,"First"); 
 
fillValue(data_2,"Second"); 
 

 
function fillValue(link2GlobalVar, value){ 
 
    link2GlobalVar.value = value; 
 
} 
 

 
document.write(data_1.value + "<br/>" +data_2.value);

Кроме этого, this, должно быть более компактен, чем window. (Работает как в браузере, так и на nodejs). Вы не можете использовать его из внутренних функций (которые не вызывают с новыми), если вы находитесь в строгом режиме, но можете использовать его в глобальной области, чтобы получить ссылку на глобальную область.

"use strict"; 
 
var data_1; 
 
var data_2; 
 
var global = this; //get a reference to the global object 
 
    
 
fillValue("data_1","First"); 
 
fillValue("data_2","Second"); 
 

 
function fillValue(globalVariableName, value){ 
 
    //`this` instead of `global` would work here only if you're not in strict mode 
 
    global[globalVariableName] = value; 
 
} 
 

 
document.write(data_1 + "<br/>" +data_2);

+2

Мне нравится это лучше, чем у меня собственный ответ. Скорее всего, это ближе к тому, что хочет OP. –

+0

Вот подходящая скрипка: http://jsfiddle.net/gulli/b74Lg5ax/ Это работает! – wurstbrotrest

+1

Я бы не использовал 'this'. Он не работает в «строгом режиме». Из документа [MDN Docs] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#.22Securing.22_JavaScript): «В браузерах больше невозможно ссылаться на« окно » объект через 'this' внутри функции строгого режима." –

4

JavaScript не имеет ссылки таким же образом другие языки делают. Когда вы делаете fillValue(data_1,"First");, вы проезжаете data_1 по значению. Таким образом, вы не можете обновить data_1, потому что в функции все, что у вас есть, есть копия данных.

Если эти переменные глобальный, то вы можете сделать то, что предлагает связанный ответ и передать имя переменной:

fillValue("data_1", "First"); 
fillValue("data_2", "Second"); 

function fillValue(link2GlobalVar, value){ 
    window[link2GlobalVar] = value; 
} 

UPDATE: В JavaScript, если вы передаете объект в качестве параметра , то это фактически передается по ссылке. Вы можете попробовать что-то вроде этого:

var datas = {}; 

fillValue(datas, "data_1", ,"First"); 
fillValue(datas, "data_2", "Second"); 

function fillValue(obj, key, value){ 
    obj[key] = value; 
} 
+1

@blex - это тот же ответ, это просто объясняется лучше. – adeneo

+0

@adeneo жаль, что я увлекся, думая, что OP уже передал строку в качестве имени переменной, как в [ответе, который он связал] (http://stackoverflow.com/questions/18178728/passing-a-global-variable- к-а-функции/18178788 # 18178788). +1 – blex

+1

@blex - На самом деле, Crayons ответ кажется неправильным, поскольку это ** не ** передача строки, и этот ответ не будет работать. – adeneo

0

этот вопрос кажется немного сумасшедшим, но вы могли бы передать имя глобальной в виде строки, а затем установить с Eval:

function blah(nameAsString, val){ eval("window." + name + " = " + val);}

даже безумнее! :)

+0

Это потенциальная дыра в безопасности (и огромная в этом), если вы не дезинформируете вещи. – PSkocik

+0

На самом деле, не делайте этого. Зачем вам делать «окно». + name' inside 'eval()' over 'window [name]' без 'eval()'? –

+0

Опция, использующая eval, на самом деле является хорошим вариантом, если переменная должна быть построена с использованием строк. Я попытался запустить этот пример (http://jsfiddle.net/gulli/7ft65ma5/), но мне не удалось. Любые идеи, чтобы исправить это? – wurstbrotrest