2015-12-21 3 views
6

На этот вопрос может быть дан ответ в другом месте, но я даже не был уверен, как начать поиск ответа. Я новичок в JavaScript, так что это борьба за меня, чтобы понять.Возврат функции Chrome Dev tools

Учитывая следующий код:

function multiple(n) { 
    function f(x) { 
     return x * n; 
    } 
    return f; 
} 
var triple = multiple(3); 
var quadruple = multiple(4); 

Когда я прохожу следующее в консоли:

console.log(triple(5)); 

я получаю то, что я ожидал, то есть 15. Точно так же с любым числом, оно будет в три раза (или в четыре раза, если я использовал вторую функцию).

Но когда я печатаю тройку в консоли я получаю следующий код:

f(x) { 
    return x * n; 
} 

не должна вернуть консоль ...

f(x) { 
    return x * 3; 
} 

... так как 3 закодированы в функция в силу следующего кода:

var triple = multiple(3); 
+5

Вы как-то ответили на свой вопрос, 3 не «закодированы в» f, вы передаете его в качестве параметра. Консоль просто показывает вам источник для функции, которую она имеет. Теперь в вашем источнике есть x * 3. – pvg

+0

это так называемое [закрытие] (https://www.wikiwand.com/en/Closure_ (computer_programming)). См. Также [«Лексические среды: общая теория»] (http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-common-theory/) – user2683246

ответ

3

3не жесткий код в функции. Код f относится к переменной n, а не к числу 3.В вашем коде, так бывает, что нет никакого способа изменить n, но представьте себе код, где это способ изменить n:

function multiple(n) { 
    function f(x) { 
     return x * n; 
    } 
    function modifyN(newN) { 
     n = newN; 
    } 
    return { f: f, modifyN: modifyN }; 
} 
var resultFor3 = multiple(3); 
var triple = resultFor3.f; 
var modifyTripleN = resultFor3.modifyN; 

Как вы можете видеть n не жестко; он ничем не отличается от любой другой переменной. В вашем конкретном примере нет способа изменить n после окончания multiple, но это не делает значения внутри замыкания, созданные вызовом multiple, «жестко запрограммированным».

2

Ну, это то же самое, как если бы вы были:

var n = 3; 
    function f(x) { 
    return n * x; 
    } 

При входе f вы увидите функцию выше, но когда вы называете это n получат свое значение из ближайших переменного называется n в цепочке областей видимости, в нашем случае n = 3 значение для n объявлено в глобальном масштабе.

Я не знаю точный способ, в котором JS двигатель хранит n переменную внутри этого закрытия (в вашем случае закрытия, созданного с помощью функции multiple), но то, что является важным является то, что переменные внутри крышки являются сохранен на reference не по значению.

2

Ввод triple просто показывает исходный код вашей функции.

с 3 кодируется в функцию в силу следующего кода

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

Когда вы передаете параметр функции на высокоуровневом уровне во время выполнения, он ищет только то, что значение хранится по адресу памяти для этой переменной (или что-то в этом роде). Но он не переписывает исходный код функции.

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