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

Javascript 为什么从HTML调用时,“立即调用的函数表达式”中的命名函数未定义?,javascript,html,Javascript,Html,我有这个密码: Javascript (function() { function read() {...} })(); HTML 控制台说,读取是未定义的。 在删除了生命之后,它起作用了,为什么 谢谢 因为它不是全局定义的。它只在立即调用的函数的范围内定义。要使其全球化,请使用以下选项: function read() {...} (function() { ... })(); 或者这个: (function() { window.read = f

我有这个密码:

Javascript

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

控制台说,读取是未定义的。 在删除了生命之后,它起作用了,为什么


谢谢

因为它不是全局定义的。它只在立即调用的函数的范围内定义。要使其全球化,请使用以下选项:

function read() {...}    

(function() {
    ...
})();
或者这个:

(function() {
    window.read = function() {...}    
})();
或者更好的方法是,在立即调用的函数中绑定onload事件:

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

在这种情况下,读取的定义在IIFE中。这将函数的范围限制为IIFE及其子函数。onload处理程序在全局范围内执行,因此没有读写权限

(function() {
    function read() { ... }
})();
和写作几乎是一回事

(function() {
    var read = function() { ... } //this is different, but not significantly so
                                  //for purposes of teaching this point
})();
我认为您应该已经理解了为什么在函数中声明的var在该函数的作用域之外不可用

函数定义函数read{…}的行为与将函数表达式赋给变量var read=function{…}的行为略有不同;函数名和函数名何时关联,但两者在其他方面是相同的。

下面是一个例子

由于您在函数中声明了read,因此它是该函数的局部。 在函数中声明的任何内容都将是函数的局部内容

通过将其作为属性分配给Windows,可以显式地将其放入全局范围:


在你尝试使用像IIFE这样的模式之前,先搜索一下Google javascript作用域。为什么要否决一个非常好的问题?这正是IIFE封装的目的。@DanAbramov你如何搜索IIFE而没有看到它是关于作用域和封装的?@dystroy:我花了几个月的时间才完全摸索javascript作用域/闭包。问题通常是,你认为你是一个从C语言来的JS初学者,理解他们,但事实上你不理解,你慢慢地,一个接一个地发现,直到你完全意识到自己的无能并着手解决它。嘿,我只是来这里删除这个问题,但我无意中投票给了close,因为话题偏离了……嗯,好吗?然而,我仍然需要创建一个关于如何解析来自外部.js的javascript的内部图像…我能想象它是用HTML编写的,就像它在没有src的情况下一样,很明显吗?谢谢,瓦希,我选择你是因为你最有代表性
(function() {
    var read = function() { ... } //this is different, but not significantly so
                                  //for purposes of teaching this point
})();
(function() {
    function read() {...}    

    window.read = read;
})();