为什么在从HTML调用时,“立即调用的函数表达式”中的命名函数未定义?

时间:2014-01-06 12:49:38

标签: javascript html

我有这段代码:

的Javascript

(function() {
    function read() {...}    
})();

HTML

<body onload="read()">

控制台说,read is undefined。 删除IIFE后,它有效吗?

感谢。 :)

4 个答案:

答案 0 :(得分:3)

这是long but satisfying explanation about JavaScript scope and closures

由于您在函数内声明read,因此它是该函数的本地函数 你在函数中声明的任何内容都是本地的。

您可以通过将其指定为window的属性来明确地将其置于全局范围内:

(function() {
    function read() {...}    

    window.read = read;
})();

答案 1 :(得分:2)

书写

(function() {
    function read() { ... }
})();

与写作非常相似

(function() {
    var read = function() { ... } //this is different, but not significantly so
                                  //for purposes of teaching this point
})();

我认为您应该已经理解为什么函数内部声明的var在该函数范围之外不可用。

函数定义(function read() { ... })的行为与将函数表达式赋值给变量(var read = function() { ... };)的行为略有不同,就函数名称和函数的变量而言相关的,但两者是相同的。

答案 2 :(得分:1)

因为它没有全球定义。它只被定义在范围内的那个立即调用的函数。要使其全球化,请使用:

function read() {...}    

(function() {
    ...
})();

或者这个:

(function() {
    window.read = function() {...}    
})();

或者更好的是,只需在紧接调用的函数中绑定onload事件:

(function() {
    function read() {...}
    window.onload = read;
})();

答案 3 :(得分:1)

在这种情况下,read的定义在IIFE内。这将函数的范围限制为IIFE及其内部的任何子函数。 onload的处理程序在全局范围内执行,因此无权访问read