Иоганн Цукерторт, один из известнейших шахматистов второй половины XIX века, как-то заключил пари с двумя другими гроссмейстерами - Стейницем и Блэкберном, которые были явно сильнее его. Суть пари состояла в том, что Цукерторт проведет с мастерами сеанс одновременной игры вслепую, набрав при этом не менее одного очка. Чтобы выиграть спор, необходимо иметь либо один выигрыш, либо две партии сыграть вничью. Цукерторт пари выиграл, но благодаря не шахматному искусству, а собственной сообразительности. Как ему это удалось?
В качестве гарантии выигрыша Цукерторт использовал… своих противников. Он не играл с каждым из мастеров, а просто передавал своим противникам ходы друг друга. Фактически Блэкберн и Стейниц играли между собой, а Цукерторт был всего лишь посредником. Исход поединка был предрешен заранее: ничья или победа одного из гроссмейстеров была обеспечена, даже если бы Цукерторт вообще не умел играть в шахматы.
функция, созданная внутри iframe, замкнула внутрифреймовую глобальную переменную, и продолжает работать, даже когда фрейм удалили. Кнопкой frameValue можно убедиться, что в window той переменной нет.
<script>
var globalValue = 1000;
var globalCounter = function() {
return globalValue++;
};
</script>
<div>
<button>iframe counter</button>
<button>globalCounter</button><br >
<button>frameValue</button>
<button>globalValue</button>
</div>
const iframeHTML = 'iframe...<' + `script>
var frameValue = 1;
var counter = function() {
// debugger;
return frameValue++;
};
window.parent.iframeCounter = counter;
<` + '/script>';
function createTempFrame() {
const blob = new Blob([iframeHTML], {type: "text/html"});
const frm = document.createElement('iframe');
frm.src = URL.createObjectURL(blob);
document.body.appendChild(frm);
setTimeout(() => {
document.body.removeChild(frm);
}, 900);
}
window.onload = function () {
const buttons = document.querySelectorAll('button');
buttons[0].onclick = function() {
alert(iframeCounter());
};
buttons[1].onclick = function() {
alert(globalCounter());
};
buttons[2].onclick = function() {
alert(window.frameValue);
};
buttons[3].onclick = function() {
alert(window.globalValue);
};
createTempFrame();
};
Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе.
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.[1]
Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.
In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment.[1] The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] Unlike a plain function, a closure allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.
The concept of closures was developed in the 1960s for the mechanical evaluation of expressions in the λ-calculus and was first fully implemented in 1970 as a language feature in the PAL programming language to support lexically scoped first-class functions.[2]
Peter J. Landin defined the term closure in 1964 as having an environment part and a control part as used by his SECD machine for evaluating expressions.[3] Joel Moses credits Landin with introducing the term closure to refer to a lambda expression whose open bindings (free variables) have been closed by (or bound in) the lexical environment, resulting in a closed expression, or closure.[4][5] This usage was subsequently adopted by Sussman and Steele when they defined Scheme in 1975,[6] a lexically scoped variant of Lisp, and became widespread.
Важная идея в работе с составными данными — понятие замыкания (closure): клей для
сочетания объектов данных должен позволять нам склеивать не только элементарные
объекты данных, но и составные.
Procedures are Closures
Scheme procedure's aren't really just pieces of code you can execute; they're closures.
A closure is a procedure that records what environment it was created in. When you call it, that environment is restored before the actual code is executed. This ensures that when a procedure executes, it sees the exact same variable bindings that were visible when it was created--it doesn't just remember variable names in its code, it remembers what storage each name referred to when it was created.
Since variable bindings are allocated on the heap, not on a stack, this allows procedures to remember binding environments even after the expressions that created those environments have been evaluated. For example, a closure created by a lambda inside a let will remember the let's variable bindings even after we've exited the let. As long as we have a pointer to the procedure (closure), the bindings it refers to are guaranteed to exist. (The garbage collector will not reclaim the procedure's storage, or the storage for the let bindings.)
Here's an example that may clarify this, and show one way of taking advantage of it.
Suppose we type the following expression at the Scheme prompt, to be interpreted in a top-level environment:
Scheme> (let ((count 0)) (lambda () (set! count (+ count 1)) count)))
##
Evaluating this let expression first creates a binding environment with a binding for count. The initial value of this binding is 0. In this environment, the lambda expression creates a closure. When executed, this procedure will increment the count, and then return its value. (Note that the procedure is not executed yet, however--it's just created.) This procedure, returned by the lambda expression, is also returned as the value of the let expression, because a let returns the value of its last body expression. The read-eval-print loop therefore prints a representation of the (anonymous) procedure.
Я тут погуглил, и мне стало интересно, большинство вопросов о том, какой язык самый лучший, какой язык самый популярный, какой язык самый быстрый.
Вот я могу вызвать метод, или написать метод какого-то вычисления, то это скорость чего будет?Скорость языка или грамотность программиста? Или производительность компьютера?ответом на этот вопрос будет ответ на мой вопрос - Вот ты можешь прыгнуть, можешь подумать, то это скорость чего будет? Скорость твоего языка или твоя грамотность? Или атмосферное давление? А если одна рука быстрее, значит нога лучше?
А если один язык посчитал быстрее, значит он лучше?
А количество написанных строк кода при достижении одинакового результата показывает какой язык лучше?конечно. Вот смотри решение задачи на брейнфаке под спойлером. Используется только 8 символов для команд и все в одну строку, что может быть лучше? Самый лучший язык
как вообще определяется лучшесть и быстростьочевидно статьи будут в разы полнее, чем любой из ответов здесь. Ты уже пробовал гуглить, значит тебя не забанили, продолжай
я не знаю как правильно назвать тот или иной класс
нужно ли для всех тегов писать классы
не понимаю зачем нужен container и wrapper
Я забросил вёрстку и начал изучать JavaScript. Но после изучения основ я вернулся к проблеме что не умею верстать.
Уже пробывал не сразу верстать весь макет, а разделять его на части и начал с хедера то есть с шапки и так где то 10 макетов но на макетах разные шапки и не везде их получается сверстать.
<nav></nav>
<nav>
<span>My site</span>
<a href="page1.html">Page1</a>
<a href="page2.html">Page2</a>
</nav>
a {
text-decoration: none;
}
nav a {
text-decoration: none;
}
<nav class="main-navbar">
<span>My site</span>
<a href="page1.html">Page1</a>
<a href="page2.html">Page2</a>
</nav>
.main-navbar a {
text-decoration: none;
}
Не знаю может это мне не дано или я делаю что то не так. Я не могу решить эту ОГРОМНУЮ проблему.
Хочется изучать что то новое но я застрял на этой вёрстке и не могу двигаться дальше.