基于自执行函数的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只会引用外部作用域中的变量。访问它,修改它。。。