Вы могли записать этот дополнительный метод:
// Possibly call this "Do"
IEnumerable<T> Apply<T> (this IEnumerable<T> source, Action<T> action)
{
foreach (var e in source)
{
action(e);
yield return e;
}
}
Профессионалы
Позволяет объединять в цепочку:
MySequence
.Apply(...)
.Apply(...)
.Apply(...);
Недостатки
Это ничего на самом деле не сделает, пока Вы не сделаете что-то для принуждения повторения. По этой причине это нельзя назвать .ForEach()
. Вы могли записать .ToList()
в конце, или Вы могли записать этот дополнительный метод, также:
// possibly call this "Realize"
IEnumerable<T> Done<T> (this IEnumerable<T> source)
{
foreach (var e in source)
{
// do nothing
;
}
return source;
}
Это может быть слишком значительным отъездом из поставлющихся библиотек C#; читатели, которые не знакомы с Вашими дополнительными методами, не будут знать, что сделать из Вашего кода.
Эти два фрагмента объявляют функцию в текущей области видимости с именем "onload". Привязка не выполняется.
function onload() { ... }
.
var onload = function() { ... }
Этот сниппет назначает функцию свойству/переменной/полю с именем "onload" в текущей области видимости:
onload = function() { ... }
Причина, по которой Firefox выполнил привязку и вызвал событие onload в первом сниппете, а в остальных - нет, может быть в том, что сам Firefox chrome (его пользовательский интерфейс) написан и автоматизирован с помощью JavaScript - вот почему он такой гибкий и на него легко писать расширения. Каким-то образом, когда вы объявили локально скопированную функцию onload
таким образом, Firefox "заменил" реализацию window
(скорее всего, локальный контекст в то время) на onload
(в то время пустую функцию или неопределенную), в то время как другие браузеры корректно "поместили" это объявление в другую область видимости (скажем, global
или что-то еще).
Многие люди правильно указывают на глобальную / локальную разницу между ( ОБНОВЛЕНИЕ: эти ответы в основном удалены их авторами сейчас )
var x = function() {
и
function x() {
Но это на самом деле не отвечает на ваш конкретный вопрос, поскольку вы на самом деле не выполняете первый из них.
Разница между ними в вашем примере такова:
// Adds a function to the onload event
onload = function() {
alert("hello");
}
В то время как
// Declares a new function called "onload"
function onload() {
alert("hello");
}
Вот что я думаю, основываясь на о полезных комментариях Тима Дауна и кратком обсуждении с Джонатаном Пенном:
Когда интерпретатор JavaScript назначает свойство window.onload
, он обращается к объекту, который ему предоставил браузер. Сеттер, который он вызывает, замечает, что свойство называется onload
, и поэтому передается остальной части браузера и связывает соответствующее событие. Все это выходит за рамки JavaScript - сценарий просто видит, что свойство было установлено.
Когда вы пишете объявление function onload () {}
, сеттер не вызывается в совершенно так же. Поскольку объявление вызывает присвоение во время синтаксического анализа , а не во время оценки, интерпретатор сценария продолжает и создает переменную, не сообщая браузеру; в противном случае оконный объект не готов принимать события. Как бы то ни было, у браузера нет возможности увидеть присвоение, как это бывает, когда вы пишете onload = function () {}
, который проходит через обычную процедуру установки.
onload = function () {}
, который проходит через обычную процедуру установки. Поскольку объявление вызывает присвоение во время синтаксического анализа , а не во время оценки, интерпретатор сценария продолжает и создает переменную, не сообщая браузеру; в противном случае оконный объект не готов принимать события. Как бы то ни было, у браузера нет возможности увидеть присвоение, как при написании onload = function () {}
, которое проходит через обычную процедуру установки. var onload = function() {
alert("hello");
}
Будет объявлено также локально.
Я предлагаю вам прочитать эту очень полезную статью: http: // kangax. github.io/nfe/
Это генерирует ошибку:
foo();
var foo = function(){};
Это не так:
foo();
function foo(){}
Следовательно, второй синтаксис лучше, когда вы используете функции для модуляции и организации кода, тогда как первый синтаксис лучше подходит для парадигмы функций как данных.
Простейшее объяснение:
function aaaaaaa(){
Может использоваться до объявления:
aaaaaaa();
function aaaaaaa(){
}
Но это не работает:
aaaaaaa();
aaaaaaa=function(){
}
Это потому, что в третьем коде вы назначаете aaaaaaa анонимной функции, а не объявляете ее как функция.