2012-04-02 24 views
17

如果我跑定义之前,下面的功能,我会得到这个错误...在调用它之前是否需要定义一个Javascript函数?

Uncaught ReferenceError: openModal is not defined 

运行,然后定义

$(document).ready(function() { 

    delay(openModal, 2000); 

    delay = function (f, t) { 
     setTimeout(function() { 
      f(); 
     }, t); 
    }; 

    openModal = function() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

}); 

现在,如果我先定义函数,然后调用它,它的工作原理...我在PHP中有一个背景,所以我习惯于能够全局访问函数,我是否做错了什么,或者在使用之前必须定义所有函数?

$(document).ready(function() { 

    delay = function (f, t) { 
     setTimeout(function() { 
      f(); 
     }, t); 
    }; 

    openModal = function() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

    delay(openModal, 2000); 

}); 
+0

是一切,即你声明的标识符'openModal'(而不是限定它)上面范围?例如'var openModal;' – Rup 2012-04-02 08:59:04

+2

相关:http://stackoverflow.com/questions/261599/why-can-i-use-a-function-before-its-defined-in-javascript – TJHeuvel 2012-04-02 08:59:12

+0

@Rup这是第一次openModal被使用 – JasonDavis 2012-04-02 08:59:55

回答

32

当你将一个函数的变量,您必须先指定它,然后才能使用该变量来访问该函数。

如果你声明与常规语法,而不是将其分配给一个变量的函数,当代码解析它的定义,所以此工程:

$(document).ready(function() { 

    delay(openModal, 2000); 

    function openModal() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

}); 

(注意:在范围上的差异,但如果你。创建变量openModal只是使用它隐式地创建,它将在全局范围内创建并且可供所有代码使用。在另一个函数内部声明函数时,它只会在该函数内部提供。变量本地的功能也使用var openModal = function() {。)

6

将函数定义移动到document.ready块之外,并且事情将按预期工作。在javascript中(与大多数语言一样),您必须在对其进行引用之前定义一个函数或变量。

在第一个示例中,您在delay()的调用中引用openModal,但javascript无法知道openModal是什么。

openModal = function() { 
    $('#modal-box').css({ 
     left: $(window).width()/2 - $('#modal-box').width()/2, 
     top: $(window).height()/2 - $('#modal-box').height()/2 
    }); 
    $('#modal-box').show(); 
    $('#modal-mask').show(); 
}; 

$(document).ready(function() { 
    delay(openModal, 2000); 
}); 

编辑:

TJHeuvel指出function做一些挂羊头卖狗肉定义函数之前,什么都在同一块被执行: Why can I use a function before it's defined in Javascript?

+4

定义外部功能的要点是什么? *“您必须先定义一个函数,然后再参考它”*:不一定。由于函数*声明*被挂起,你可以在任何地方定义它们,当前作用域中的其他代码可以调用它。只有函数*表达式*可以在分配后调用。 – 2012-04-02 09:04:57

+0

请注意,当您将函数分配给变量时,TJHevel指出的内容不适用。即使函数对象本身是在解析代码时创建的,它也会在运行时分配给变量。 – Guffa 2012-04-02 09:13:56

-1

在shor牛逼是你必须使用一个函数之前定义它,但你可以使用你的延迟的setTimeout函数,它接受一个字符串作为代码exectute:

$(document).ready(function() { 

    setTimeOut('openModal()', 2000); 

    openModal = function() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

}); 

这会工作作为函数不叫,直到在它被定义之后。

+2

您的第一个建议不起作用,因为在您调用'delay(openModal,2000)'的那一刻,'openModal'仍然持有对空函数的引用。实际功能只在之后分配,但不影响您已经通过的值。你的第二个建议只能“错误地”起作用。由于'openModal'没有用'var'声明,它是全局的。但是,只要你用'var'正确地声明了它,它就不会工作了,因为'setTimeout'在全局作用域中评估字符串(并且'openModal'对于就绪事件处理程序是本地的)。 – 2012-04-02 09:06:36

+0

好的谢谢。编辑 – Richard 2012-04-02 09:08:43

1

我会说,是的。在调用之前,必须定义一个函数。 但有些函数可以被调用(调用)已经被定义之前,他们(吊)

两种不同类型的功能,我想写的是:

表达功能&减速功能

1 - 表达式函数:函数表达式可以存储在一个变量中,因此它们不需要函数名。它们也将被命名为匿名函数(一个没有名字的函数)。调用(调用)它们总是需要使用变量名称。如果调用之前调用了这些函数,则这些函数将不起作用,这意味着这里不会出现“提升”。我们总是必须首先定义表达式函数,然后调用它。

let lastName = function (family) { 
console.log("My last name is " + family); 
};   
let x = lastName("Lopez"); 

这是你如何在ES6写:

lastName = (family) => console.log("My last name is " + family); 
x = lastName("Lopez"); 

2-减速功能:函数声明的语法如下不立即执行。它们被“保存以供以后使用”,并且当它们被调用(调用)时将在稍后被执行。如果在它们被定义之前或之后调用它们,则这些类型的函数起作用。如果在定义之前调用减速功能 - 起升 - 正常工作。

function Name(name) { 
    console.log("My cat's name is " + name); 
} 
Name("Chloe"); 

吊装例如:

Name("Chloe"); 
function Name(name) { 
    console.log("My cat's name is " + name); 
} 
相关问题