функция
Формат функции
Функция getProtoTynames (O,/*Необязательно*/ a) {a = a || []; for (var p in o) {a.push (p);} return a;}Вызывающий абонент
func.caller возвращает функцию вызывающего абонента
function callfunc(){if(callfunc.caller){alert(callfunc.caller.toString());}else{alert("no function call");}}function handleCaller(){callfunc();}handleCaller();//Return handlercallfunc();//No function call, return null, execute "No function call"Калле
Анонимный метод рекурсивный вызов
Alert ((function (x) {if (x <=) return; return x * arguments.callee (x -);} ())); //объем
Все знакомы с масштабами. Сегодня я расскажу о проблеме закрытия и тщательно пойму проблему закрытия.
<script> var global = "Global Scope"; // Это глобальная функция функции () {var scope = "Local Scope"; // Это локальная область возврата1.: Определенные глобальные переменные также можно получить внутри функции . Когда определенная локальная переменная и глобальные имени переменной одинаковы, локальная переменная будет скрывать глобальную переменную и не уничтожит значение глобальной переменной.
var scope = "global acpope"; function f () {var scope = "local acpope"; return scope;} alert (f ()); // local scopealert (scope); // global scope;Вышесказанное действительно легко понять, верно?
2. Глобальные переменные могут быть объявлены без VAR , но локальные переменные должны быть объявлены с помощью VAR. Если локальные переменные не используют объявление VAR, компилятор по умолчанию по умолчанию в качестве глобальной переменной.
<span style = "line-height: .; font-family: verdana, arial, helvetica, sans-serif; font-size: px; фоновый цвет: rgb (,,);"> </span> scope = "Глобальная область"; function f () {Scope = "локальная область";Тем не менее, глобальные переменные не используют объявления VAR и доступны только для не Strict Mode. Если используется строгий режим, сообщается об ошибке.
<Script> «Использовать строгое»; Scope = "Global Scope"; function f () {scope = "локальный объем"; return acpope;} alert (f ()); // локальный spopealeert (scope); // локальная область </script>Поэтому рекомендуется не опускать VAR при объявлении переменных, поскольку это может избежать ненужных проблем.
3. Это нормально объявить заранее . Что такое заранее.
<Script> «Использовать строго»;
Это можно рассматривать как первый, который печатает неопределенным. Да, ему еще не было назначено значение. Следующее назначение может определить глобальную область.
Это не неправильно, но почему это происходит? Разве переменная не должна быть определена, прежде чем ее можно будет использовать?
Здесь я расскажу вам о цепочке прицелов. JavaScript - это лексический язык.
1. Цепочка областей - это объект или связанный список. Этот набор кода определяет переменные «в объеме» этого кода. Когда JavaScript необходимо найти сферу переменной, он будет разрабатывать и искать из первого объекта в цепочке. Если первый объект является областью применения, значение этого объекта будет возвращено непосредственно. Если его не существует, он будет продолжать искать второй объект, пока не будет найден. Если переменная не найдена в цепочке применения, будет выброшена ошибка.
Мы можем выразить эту функциональную цепочку следующим образом: Найдите окно облада (глобальный объект), а затем определяется область. Тем не менее, операция назначения не была выполнена, и операция назначения была выполнена позже, поэтому значение в настоящее время не определено.
4. Это более запутанно. Что такое печатная стоимость?
<Script> «Использовать строгое»; var scope = "global acpope"; function f () {console.log (scope); var scope = "local acpope"; console.log (scope);} f (); </script>Смотрите этот код: Если вы небрежны, вы можете написать неправильный ответ:
1. Gobal Scope
2. Местная сфера
Анализ: объявить глобальные переменные. В корпусе функции первая представляет глобальную переменную, поэтому глобальная напечатана, а второй определяет локальные переменные, охватывающие глобальную область, поэтому напечатана локальная область.
Такой анализ полностью верен в C# Java. Но анализ здесь действительно неправильный.
Это показывает, что до этой проблемы давайте сначала посмотрим на вопрос.
Это предложение очень важно: глобальные переменные всегда определяются в программе. Локальные переменные всегда определяются в организме функции, которая объявляет ее, и функции, которые она гнездирует.
Если вы работаете на языке высокого уровня, вы подвергаетесь JavaScript немного непригодным для определения объема. Я такой же. Давайте посмотрим на пример:
<script> var g = "Global Scope"; function f () {for (var i =; i <; i ++) {for (var j =; j <; j ++) {;} console.log (j);} console.log (i);} console.log (g); f (); </script>;Каков результат печати?
Вы видите, что {} представляет блок операторов, а блок операторов находится в объеме того же блока, поэтому вы можете догадаться, что значения J и I были выпущены в памяти, поэтому результат должен быть неопределенным.
Реальный результат может вас разочаровать.
Почему это произошло? Мое выражение началось как ты.
Проверьте предложение, которое я попросил вас запомнить сейчас. Полем Полем Глобальные переменные всегда определяются в программе. Локальные переменные всегда определяются в организме функции, которая объявляет ее, и функции, которые она гнездирует.
Чтобы быть точным, параметры функции также принадлежат категории локальных переменных. Это предложение также очень важно! ! !
Это предложение примерно означает, что до тех пор, пока переменная, определенная внутри функции, действительна во всей функции. Таким образом, результат не сложно понять. Оглядываясь назад на наш вопрос, понимаете?
Цепочка действия также имеет следующие определения:
1. Цепочка действий состоит из глобального объекта.
2. В телефонах, который не содержит гнездования, в цепочке действий есть два объекта. Первый объект определяет параметры функции и локальные переменные, а второй - глобальный объект.
3. В вложенном функциональном теле существует как минимум три объекта в цепочке действий.
Когда функция определена, цепочка применения будет сохранена.
Когда эта функция вызывается, она создает новый объект для хранения своих локальных переменных и добавляет этот объект в сохраненную цепочку действия. В то же время создайте новую более длинную цепочку функций, представляющих вызовы функций.
Для вложенных функций, когда вызывается внешняя функция, внутренняя функция снова будет переопределена. Поскольку каждый раз, когда называется внешняя функция, цепочка действий отличается. Внутренние функции имеют тонкие различия каждый раз, когда они определяются. Каждый раз, когда вызывается внешняя функция, код внутренней функции одинаков, а объем связанного кода также отличается.
Закрытие
Сделав это так долго, я наконец -то поговорил об этом, но давайте проанализируем масштаб раньше.
<script> var nameg = "global" var g = function f () {console.log (name); function demo () {console.log ("demo =" + name);} var name = ""; function demo () {var name = ""; console.log ("demo =" + name);} demo () {stole. nameg);} demo (); demo (); demo ();}; g (); </script>Мы анализируем в соответствии с цепочкой действий:
Позвоните Demo0, demo0 () -> Найти имя, не найдено -> f (), return
Позвоните Demo1, demo1 ()-> Найти имя, найти, вернуть
Вызовите Demo2, demo2 () -> Найти имя, не найденное -> f (), чтобы найти имя, не найденное -> окно, чтобы найти имя, возвращение.
Посмотрите на этот пример:
<script> function f () {var count =; return {counter: function () {return count ++;}, сброс: function () {return count =;}}} var d = f (); var c = f (); console.log ("d первое вызов:"+ d.counter ()); // console.log ("c -first call:"+ conter (); Первый вызов: "+ c.counter ()); // </script>Как вы можете видеть в этом примере, я выполнял операцию подсчета и обнурания.
Создаются два экземпляра F -объекта, каждый из которых со своей собственной цепочкой, поэтому их значения не влияют друг на друга. Когда C называется вторым раз, значение подсчета сохраняется, потому что объект C не уничтожен. Только после понимания этого примера следующий пример будет легче понять.
Каждый должен быть очень ясным в этом процессе. Итак, теперь давайте посмотрим на проблему закрытия. Я устанавливаю четыре кнопки и нажимаю каждую кнопку, чтобы вернуть имя ответа.
<body> <script> function btninit () {for (var i =; i <; i ++) {var btn = document.getElementbyId ("btn" + i); btn.addeventListener ("click", function () {alert ("btn" + i);}); id = "btn"> btn </button> <button id = "btn"> btn </button> <button id = "btn"> btn </button> <button id = "btn"> btn </button> </div> </body>Нажмите, чтобы запустить, но результат - все BTN5;
Мы сели с анализом только сейчас. Во -первых, нам нужно вызвать анонимную функцию -> Найти я, не найденный -> btninit (), и найти i в цикле для. оказаться. Мы знаем, что выпущен только вызов функции, и я всегда виден, поэтому последнее значение я сохраняется. Так как это решить.
Чтобы решить проблему, что значение I не всегда видно в функции, нам необходимо использовать гнездование функции и передать значение I I.
function btninit () {for (var i =; i <; i ++) {(function (data_i) {var btn = document.getElementbyid ("btn" + data_i); btn.addeventlistener ("click", function () {alert ("btn" + data_i);});Глядя на измененный код, сначала выполните первый для и создайте объект. Сначала мы выполняем анонимную функцию -> data_i, но не нашли -> function (data_i), а затем снова выполняем для создания объекта. Правила закрытия говорят, что они не влияют друг на друга. Таким образом, правильный результат можно получить.
Выше приведено, что JavaScript должна знать, чтобы знать (9) функцию, которую редактор представляет вам. Говоря о соответствующих знаниях по вопросам закрытия, я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!