我有这段代码:
的Javascript
(function() {
function read() {...}
})();
HTML
<body onload="read()">
控制台说,read is undefined
。
删除IIFE后,它有效吗?
感谢。 :)
答案 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