Javascript: глобальная переменная, передаваемая по ссылке на хранимую функцию - PullRequest
0 голосов
/ 08 января 2019

У меня есть кое-что, чего я просто не понимаю, с помощью интерпретатора javascript.
Когда переменная передается в параметре хранимой функции, кажется, что она передается по ссылке, а не по значению.

Здесь PoC:

var nb = 10;
var varfunc;

function myFunc(a) {
  console.log("after = " + a);
}

console.log("before = " + nb);
varfunc = function() {
  myFunc(nb)
};

nb = nb + 1;

varfunc();

Я ожидал, что будет иметь значение "10" для обоих выходов.
Как я могу фактически передать значение «nb», когда инструкция «set» выполняется для переменной «varfunc»?

Я столкнулся с этой проблемой при установке свойства «onClick», в котором я связал функцию с глобальной переменной, передаваемой в качестве параметра:

var global_var = 0;
...
function oneFunction(){
  var delImg = document.createElement("img");
  delImg.src = "images/delete.gif";
  delImg.onclick = function(){
                     deleteFG(global_var);
                   };
...
}
...
oneFunction();

Когда вызывается событие «onClick», функция «deleteFG ()» вызывается с текущим значением «global_var», а не со значением, которое было при обработке инструкции set для «onClick».

Я нашел грязное решение, создав временную переменную:

var global_var = 0;
...
function oneFunction(){
  var delImg = document.createElement("img");
  delImg.src = "images/delete.gif";
  var tmp_var = global_var;
  delImg.onclick = function(){
                   deleteFG(tmp_var);
                 };  
...
}
...
oneFunction();

Может кто-нибудь объяснить, пожалуйста? :)

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я ожидал, что будет иметь значение "10" для обоих выходов.

Сначала вы меняете nb на 11.

Затем вы вызываете varfunc, который читает значение nb (которое вы уже изменили) и передает его (11) в myFunc.

Это не имеет ничего общего со ссылками.


Если вы хотите получить значение во время создания функции, вы должны скопировать его в другую переменную в этой точке .

Для этого можно использовать замыкание (в этом примере я использую IIFE для его создания).

var nb = 10;
var varfunc;

function myFunc(a) {
  console.log("after = " + a);
}

console.log("before = " + nb);

varfunc = function(copy_of_nb) {
  return function() {
    myFunc(copy_of_nb);
  };
}(nb);

nb = nb + 1;

varfunc();

console.log("finally = " + nb);
0 голосов
/ 08 января 2019

Что-то вроде следующего должно работать. Поскольку nb является глобальной переменной, она не будет записана при создании этой функции, но при ее фактическом запуске.

В основном, когда вы запускаете эту функцию, то есть когда переменные действительно вступают в силу.

Приведенный ниже код в основном оборачивает эту функцию внутри другой функции, которая выполняется в этой строке кода и передает текущее значение nb вместо значения, когда вы фактически запускаете функцию varfunc.

var nb = 10;
var varfunc;

function myFunc(a)
{
  console.log("after = "+a);
}

console.log("before = "+nb);
var num2 = nb ;
varfunc= (function(a) {
  return function(){
    myFunc(a)
  }
})(nb);

nb = nb + 1;

varfunc();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...