2017-02-15 2 views
0

Я использовал анонимную функцию в качестве параметра в другой функции, а сама анонимная функция также имеет parmeters. Когда другая функция запущена, а анонимная функция не работает, как я ожидал Я был путан, ты можешь помочь? Код ниже:javascript переданная анонимная функция не меняет значения параметров

function go(x, func){ 
    func(x); 
    alert(x.x); 
} 

var x = {'x': 3}; 
go(x, function(x){x = {'x':99};});//actually it alert 3, not 99, x not change 
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3 

ответ

0

Что такое x?
var x = {'x': 3};

x является переменной, которая является ссылкой на фактическое значение объекта.

Первый сценарий:
go(x, function(x){x = {'x':99};});//actually it alert 3, not 99, x not change

Когда функция вызывается с помощью func(x);значение ссылки передается по значению Следующие мероприятия осуществляются

  1. новая переменная x создается
  2. Назначьте значение x (созданного на шаге 1) для глобальной переменной x, Эффективно x содержит ссылку глобальной переменной x.
  3. Далее, когда вы вносите любые изменения в x, например x = {'x':99};, просто создайте новый объект {'x':99} и назначьте новую ссылку на новый объект x. Следовательно, х (шаг 1) указывает на новый объект, который имеет значение х как 99.
  4. В следующей строке alert(x.x); х указывает на глобальный объект и так как глобальный объект х не изменяется значение x.x по-прежнему .

Второй сценарий:
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3

Первые несколько шагов подобны

  1. новую переменную x создается
  2. Присвоить значение х (созданный на шаге 1) глобальная переменная x, Эффективно x содержит ссылку глобальной переменной Икс.
  3. Это утверждение {x.x = 7;} на самом деле своего рода разыменования или пытаются получить значение глобального объекта x, а затем присвоения нового значения от 7 до глобального объекта x собственности x. Вы - , изменяя глобальный объект и не изменяя ссылку x на новый объект, поскольку в первом сценарии было выполнено . Таким образом, изменения отражаются в глобальном объекте x.
  4. Далее, оператор alert(x.x); Х является глобальным объектом, но в этом случае значение x.x (глобальный) было изменено с помощью анонимной функции .
+0

О, я делаю ошибку (╯ # -_-) ╯╧═╧ (╯ # -_-) ╯┴-┴, ссылка х сам передаются по значению , и я пытаюсь изменить значение. – stackKKK

0

Разница заключается в том, как JS интерпретирует коды x = { x: 99} и x.x = 7 Первый код означает, что вы создаете совершенно новый анонимный объект {x: 99}, а затем изменить ссылку глобальной переменной x к этому объекту. Между тем второй код просто получает ссылку на глобальную переменную x и меняет ее свойство. Вот и все :)

+0

Спасибо! (• ~̑⌣~̑ •) ✧˖ ° – stackKKK

0

Для пояснений см. Выше anwers. Это исправление вашей проблемы:

function go(x, func){ 
    x=func(x)||x; 
    alert(x.x); 
} 

var x = {'x': 3}; 
go(x, function(x){return {'x':99};});//works now 
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3 
+0

Спасибо, что ответили на мой вопрос :) – stackKKK

Смежные вопросы