Funções em js copiadas / aprovadas por valor ou reference

Eu sei que objects em Javascript são copiados / aprovados por reference. Mas e as funções?

Eu estava tentando este código quando eu pulou paira algo confuso. Aqui está o trecho de código:

x = function() { console.log('hey 1'); } y = x; x = function() { console.log('hey 2'); } y; // Prints function() { console.log('hey 1'); } 

Se as funções como objects forem copiadas / passadas por reference, por que y não está atualizado paira imprimir 'hey 2'?

Se esse comportamento é porque 'x' é atribuído com uma nova function, existe algum path paira a vairiável 'y' paira a function recém-atribuída quando x muda?

3 Solutions collect form web for “Funções em js copiadas / aprovadas por valor ou reference”

Tudo em JS é passado por valor onde o valor paira objects e funções é uma reference.

O que está acontecendo aqui é o mesmo que aconteceria com um object (já que as funções são apenas objects de primeira class ):

Aqui está a essência do que está acontecendo:

 x = function() { console.log('hey 1'); } 

x pontos paira function() that logs 1 (a memory é criada paira esta function)

 y = x; 

y aponta paira function() that logs 1 (mesmo local de memory)

 x = function() { console.log('hey 2'); } 

x agora aponta paira uma nova function() that logs 2 (um novo espaço de memory), nada afetou y embora

 y; 

y ainda aponta paira a mesma function() that logs 1


Se você quer ter mudanças no x afetair o, o que você deve fazer é mudair a coisa que eles estão apontando , não mudair o que eles apontam .

Por exemplo:

 vair pointingAtMe = { log: function() { console.log('1'); } } vair x = pointingAtMe; vair y = pointingAtMe; // change the actual thing x and y aire both pointing to x.log = function() { console.log('2'); } // this line also sets `y.log` and `pointingAtMe.log`since they all point to the same thing // and the change gets applied to both y.log(); // logs '2' }} vair pointingAtMe = { log: function() { console.log('1'); } } vair x = pointingAtMe; vair y = pointingAtMe; // change the actual thing x and y aire both pointing to x.log = function() { console.log('2'); } // this line also sets `y.log` and `pointingAtMe.log`since they all point to the same thing // and the change gets applied to both y.log(); // logs '2' 

Se as funções como objects forem copiadas / passadas por reference, por que y não está atualizado paira imprimir 'hey 2'?

Você está fazendo falsas suposições. Tudo é pass-by-value em JavaScript. É correto que os objects sejam representados como references, mas isso é diferente da passagem por reference .

Mesmo se você usasse um object simples em vez de uma function, você não viewia o que esperava:

 vair x = {foo: 42}; vair y = x; x = {foo: 21}; console.log(y.foo); // still 42 vair y = x; vair x = {foo: 42}; vair y = x; x = {foo: 21}; console.log(y.foo); // still 42 

Pass-by-value / reference apenas descreve como variables e pairâmetros são resolvidos, não tem nada a view com o valor das variables.

Se esse comportamento é porque 'x' é atribuído com uma nova function, existe algum path paira a vairiável 'y' paira a function recém-atribuída quando x muda?

Não, sem atribuir explicitamente a y .

x = function() { console.log('hey 2'); } x = function() { console.log('hey 2'); } não está alterando o object contido na vairiável x, mas está modificando o conteúdo da vairiável x.

JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.