2016-10-27 9 views
3

показательна картина модуль внутренней внешняя переменная рассогласования

<html><body><button>setSpeed</button> 
 
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> 
 
<script> 
 

 
$(document).ready(function(){ 
 
    $('button').on('click', function(){ 
 
    _.setSpeed(); 
 
    console.log('_.slow: ' + _.slow); 
 
    }); 
 
}); 
 

 
var _ = (function(){ 
 
    var slow = 4; 
 
    
 
    function setSpeed(){ 
 
    if (slow == 4) { 
 
     slow = 1; 
 
    } else if (slow == 1){ 
 
     slow = 16; 
 
    } else { 
 
     slow = 4; 
 
    } 
 
    console.log('slow: '+ slow); 
 
    } 
 
    return { slow: slow, setSpeed: setSpeed }; 
 

 
})(); 
 

 
</script></body></html>

Я не понимаю, почему console.log для медленного и _.slow не совпадают? Что мне не хватает?

Возвращая как медленные, так и функции setSpeed ​​в IIEF, я думаю, они должны совпадать.

ответ

1

Когда вы сделаете это:

return { slow: slow, setSpeed: setSpeed }; 

Вы создаете новый объект с двумя свойствами, slow и setSpeed. Значение для slow назначается из var slow. Поскольку это примитивный тип (не ссылочное значение), вы получаете копию текущего значения slow (4).

Когда вы вызываете setSpeed, он изменяет var slow, меняя его на 1. Это не влияет на _.slow (так как это не ссылка).

+0

Вы можете попытаться добавить функцию геттера для медленного, если вы хотите проверить значение slow внутри yout IIEF. 'function getSlow() { return slow; } '}' в вашей части 'return'' return {getSlow: getSlow, setSpeed: setSpeed}; ' или вы можете связать функцию-геттер для вашего свойства' slow'. (Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/get) –