基于自执行函数的Javascript实现
有人能解释一下这段代码是如何产生注释输出的吗?基于自执行函数的Javascript实现,javascript,closures,hoisting,self-executing-function,Javascript,Closures,Hoisting,Self Executing Function,有人能解释一下这段代码是如何产生注释输出的吗? console.log(d,1);//未定义1 ////d尚未设置,它没有值,未定义 var d=8; (功能(){ console.log(d,2);//未定义的2 ////此函数不使用全局作用域,因此尚未设置变量d 变量d=10 console.log(d,3);//103 ////现在将局部变量d设置为10 })(); console.log(d,4);//8 4 ////这将从上面给出全局变量(值8),因为您没有使用自执行函数更改它需要记住
console.log(d,1);//未定义1
////d尚未设置,它没有值,未定义
var d=8;
(功能(){
console.log(d,2);//未定义的2
////此函数不使用全局作用域,因此尚未设置变量d
变量d=10
console.log(d,3);//103
////现在将局部变量d设置为10
})();
console.log(d,4);//8 4
////这将从上面给出全局变量(值8),因为您没有使用自执行函数更改它
需要记住的重要事项
var
声明的任何变量在控件到达其定义行之前都将未定义
,除非分配了其他内容。这是因为,在JavaScript中var
声明的任何变量的作用域都将限定为定义该变量的函数有了这样的理解,让我们来看看代码 第一节
console.log(d, 1); // undefined 1
var d = 8;
(function() {
console.log(d, 2); // undefined 2
var d = 10
console.log(d, 3); // 10 3
})();
console.log(d, 4); // 8 4
console.log(d, 1);
var d = 8;
(function() {
console.log(d, 2);
var d = 10;
console.log(d, 3);
})();
在执行d
声明的行之前访问d
。因此,d
将是未定义的
中段
console.log(d, 1); // undefined 1
var d = 8;
(function() {
console.log(d, 2); // undefined 2
var d = 10
console.log(d, 3); // 10 3
})();
console.log(d, 4); // 8 4
console.log(d, 1);
var d = 8;
(function() {
console.log(d, 2);
var d = 10;
console.log(d, 3);
})();
这里也一样。您可以在实际声明d
之前和之后访问d
。这就是为什么您将分别获得未定义
和10
最后一节
console.log(d, 1); // undefined 1
var d = 8;
(function() {
console.log(d, 2); // undefined 2
var d = 10
console.log(d, 3); // 10 3
})();
console.log(d, 4); // 8 4
console.log(d, 1);
var d = 8;
(function() {
console.log(d, 2);
var d = 10;
console.log(d, 3);
})();
由于函数内声明的变量在函数外不可用,因此此行中的
d
将与第2行中声明的变量相同。最后一个赋值是8。之所以有未定义的2
,是因为在这个函数中有var d=10
这意味着该变量将在同一范围内声明,但稍后声明
p.S:如果您想在任何地方输出
8…
,只需删除此内部var d=10
,您就会看到。因为这就是代码对引擎的外观:
console.log(d, 4);
此代码不生成注释输出。试试看,它会产生一个不同的输出:所以要么修正你的注释,要么修正你的代码,然后问一个更具体的问题。对不起,我一直在用很多不同的方式尝试这段代码,因此,在上一次执行时存储到10的
d
无法存储到10
,除非您在代码中的某个位置进行赋值。@DarinDimitrov是的,您非常正确,我刚刚在var d=10
上尝试过删除var
。太棒了!!!:)在第一行,我们得到了未定义的1
,因此您关于d
设置为10
的解释有点奇怪。你试过运行你的代码吗?@DarinDimitrov是的,但是很明显d必须是10,他只是忘记了。我同时添加了它,并对其进行了评论。没有什么明显的。我看不到任何var d=10第一个控制台.log之前OP中的code>分配。所以,让我们试着不要猜测,而是你可以问OP是否是这样,而不是把它作为一个答案发布。@DarinDimitrov。。。没有评论,但是你在评论:-)OP现在用适当的评论修改了他的原始问题。因此,请不要犹豫,相应地修改您的答案,因为在其当前状态下,它与原始代码有所不同
,然后它得到值8
,而Mid section
似乎会从第一节得到相同的值。因此,当我添加var
时,为什么函数不在同一范围内执行,并获得8
的值。前面有哪条规则?因为函数创建自己的作用域。如果您试图访问的变量未在该函数中的任何位置定义,它将进入并检查前面的作用域。如果删除第二个var
声明,它会是什么样子?知道吗?如果你没有在函数中声明var d,那么函数中的d只会引用外部作用域中的变量。访问它,修改它。。。