2013-06-20 3 views
2

В событии window.onload я бы хотел вызвать функцию. Если я определяю его как указано ниже, функция не будет вызвана.Почему window.addEventListener не работает?

try { 
    window.addEventListener("load", initialiseTable, false); 
} catch(e) { 
    window.onload = initialiseTable; 
} 

var initialiseTable = function() { 
    console.log("hello world!!"); 
}; 

, но если я изменить объявление функции в

function initialiseTable() { 
    console.log("hello world!!");}; 

это работает, любая идея?

+1

Я бы сказал, что проблема заключается в порядке выполнения, поскольку 'initialiseTable' используется для предыдущего объявления –

+0

Посмотрите здесь http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs- function-functionname –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_Cheatsheet#function_oddities – Shmiddty

ответ

3

В то время как вы используете var x = function(){} объявить функции, следует объявить перед вызовом функции.

К function x(){}, x будет существовать в текущем объеме, независимо от того, как позже оно будет объявлено. Потому что такой побочный эффект, var x = function(){} более рекомендуется. Например:

var user = 'alien'; 
if(user == 'alien') { 
    function salute() { console.log("Welcome to Earth!"); } 
} else { 
    function salute(){ console.log("Good day!"); } 
} 

salute() напечатает Good day! в любом случае, даже если это не мы хотим, чтобы у всех.

+0

вы звезда, спасибо! – 101V

2

Объявите функцию раньше.

var initialiseTable = function() { 
    console.log("hello world!!"); 
}; 
try { 
    window.addEventListener("load", initialiseTable, false); 
} catch(e) { 
    window.onload = initialiseTable; 
} 

Для получения более подробной информации об объявлении функции прочитать: var functionName = function() {} vs function functionName() {}

0

Просто поместите функцию initialiseTable на первую позицию, например:

var initialiseTable = function(){ /*[...]*/ } 

После продолжают звонить.

0

Объявление функции должно всегда предшествовать его вызову.

На этой линии: -

window.addEventListener("load", initialiseTable, false); 

initialiseTable не известно, поэтому он должен быть помещен после определения функции. Фактически оператор функции заставляет связать свой идентификатор перед тем, как что-либо в его кодовом блоке * выполняется. Объявления объявлений функций загружаются до того, как выполняется какой-либо код. Он отличается от выражения функции, которое оценивается в нормальном порядке сверху вниз. Функциональные выражения загружаются только тогда, когда интерпретатор достигает этой строки кода. так что если вы используете: -

var initialiseTable = function() { 
    console.log("hello world!!"); 
}; 

это не будет работать, но это работает: -

function initialiseTable() { 
    console.log("hello world!!");}; 
1

Поскольку вы из C#, то разница очень много, как:

class A { 
    public int method2() { 
     //I can call method1 even though it *declared* later below 
     int a = method1(); 
    } 

    public int method1() { 

    } 
} 

против

class B { 
    public int method2() { 
     bool a = method1(3); //I can't call it because it is *assigned* later below. 
         //In fact I cannot even compile it 
     Func<int, bool> method1 = x => x == 3; 
    } 
} 

Вы можете заметить разницу в JavaScript, если вы посмотрите на:

function a() { 

} 

Нет назначения нигде.

Как и в случае с var a = function(){}, очевидно, что это присвоение и похоже на последний пример C#.