JavaScript: Как “функция onload () {}” отличающийся от “onload = функция () {}”?

Вы могли записать этот дополнительный метод:

// 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#; читатели, которые не знакомы с Вашими дополнительными методами, не будут знать, что сделать из Вашего кода.

19
задан Community 23 May 2017 в 12:17
поделиться

6 ответов

Эти два фрагмента объявляют функцию в текущей области видимости с именем "onload". Привязка не выполняется.

function onload() { ... }

.

var onload = function() { ... }

Этот сниппет назначает функцию свойству/переменной/полю с именем "onload" в текущей области видимости:

onload = function() { ... }

Причина, по которой Firefox выполнил привязку и вызвал событие onload в первом сниппете, а в остальных - нет, может быть в том, что сам Firefox chrome (его пользовательский интерфейс) написан и автоматизирован с помощью JavaScript - вот почему он такой гибкий и на него легко писать расширения. Каким-то образом, когда вы объявили локально скопированную функцию onload таким образом, Firefox "заменил" реализацию window (скорее всего, локальный контекст в то время) на onload (в то время пустую функцию или неопределенную), в то время как другие браузеры корректно "поместили" это объявление в другую область видимости (скажем, global или что-то еще).

4
ответ дан 30 November 2019 в 05:20
поделиться

Многие люди правильно указывают на глобальную / локальную разницу между ( ОБНОВЛЕНИЕ: эти ответы в основном удалены их авторами сейчас )

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");
}
4
ответ дан 30 November 2019 в 05:20
поделиться

Вот что я думаю, основываясь на о полезных комментариях Тима Дауна и кратком обсуждении с Джонатаном Пенном:

Когда интерпретатор JavaScript назначает свойство window.onload , он обращается к объекту, который ему предоставил браузер. Сеттер, который он вызывает, замечает, что свойство называется onload , и поэтому передается остальной части браузера и связывает соответствующее событие. Все это выходит за рамки JavaScript - сценарий просто видит, что свойство было установлено.

Когда вы пишете объявление function onload () {} , сеттер не вызывается в совершенно так же. Поскольку объявление вызывает присвоение во время синтаксического анализа , а не во время оценки, интерпретатор сценария продолжает и создает переменную, не сообщая браузеру; в противном случае оконный объект не готов принимать события. Как бы то ни было, у браузера нет возможности увидеть присвоение, как это бывает, когда вы пишете onload = function () {} , который проходит через обычную процедуру установки.

Поскольку объявление вызывает присвоение во время синтаксического анализа , а не во время оценки, интерпретатор сценария продолжает и создает переменную, не сообщая браузеру; в противном случае оконный объект не готов принимать события. Как бы то ни было, у браузера нет возможности увидеть присвоение, как это бывает, когда вы пишете onload = function () {} , который проходит через обычную процедуру установки.

Поскольку объявление вызывает присвоение во время синтаксического анализа , а не во время оценки, интерпретатор сценария продолжает и создает переменную, не сообщая браузеру; в противном случае оконный объект не готов принимать события. Как бы то ни было, у браузера нет возможности увидеть присвоение, как при написании onload = function () {} , которое проходит через обычную процедуру установки.

1
ответ дан 30 November 2019 в 05:20
поделиться
var onload = function() {
    alert("hello");
}

Будет объявлено также локально.

Я предлагаю вам прочитать эту очень полезную статью: http: // kangax. github.io/nfe/

0
ответ дан 30 November 2019 в 05:20
поделиться

Это генерирует ошибку:

foo();
var foo = function(){};

Это не так:

foo();
function foo(){}

Следовательно, второй синтаксис лучше, когда вы используете функции для модуляции и организации кода, тогда как первый синтаксис лучше подходит для парадигмы функций как данных.

-1
ответ дан 30 November 2019 в 05:20
поделиться

Простейшее объяснение:

function aaaaaaa(){

Может использоваться до объявления:

aaaaaaa();
function aaaaaaa(){

}

Но это не работает:

aaaaaaa();
aaaaaaa=function(){

}

Это потому, что в третьем коде вы назначаете aaaaaaa анонимной функции, а не объявляете ее как функция.

0
ответ дан 30 November 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: