关于with, 立即执行函数表达式和 let的三个问题??

发布于 2022-09-01 20:44:06 字数 1489 浏览 14 评论 0

来自你不知道的JavaScript中的三个问题:
第一个问题:

   function foo(obj) {
      with(obj) {
        a = 2;
      }
    }
    var o1 = {
      a : 3
    };
    var o2 = {
      b : 5 
    };
    foo(o1);
    console.log(o1.a);  //2
    foo(o2);
    console.log(o2.a);  //undefined
    console.log(a);  //2

大概说下根据书上的分析过程:
with声明根据传递给它的对象凭空创建了一个新的词法作用域。当o2作为作用域时,没有o2.a属性(它有o2.b),于是往上级作用域中找,发现foo作用域和全局作用域中都没有,于是自动创建了全局变量(只在非严格模式下才会),所以是undefined. 但是console.log(a)的时候,为什么会输出 2 ??

第二个问题:

var a = 2;
(function IIFE(def) {
    def(window);
    console.log(a);   // 3
})(function def(global) {
    var a = 3;
    console.log(a);   // 2
    console.log(global.a);   //2
});

把def函数,传递给IIFE的也叫def的作为参数,然后,,我感觉越看越凌乱了,书中说“倒置代码的运行顺序,将需要运行的代码放到第二位,在IIFE执行后当做参数传递进去”,,请帮忙详细分析下。。
第三个问题:

{
    let j;
    for(j = 0; j < 10; j++) {
        let i = j;
        console.log(i);  //undefined
    }
}

为什么是undefined呢??

补充: 关于第三个问题,在Firefox(develpoer版), Microsoft Edge, 和Chrome中的三种显示依次如下:

图片描述

图片描述

图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱她像谁 2022-09-08 20:44:06

第二个问题可以变成这样(你代码的注释顺序错了,不是按代码顺序输出,而是按执行顺序),def函数先执行:

var a = 2;
(function IIFE() {
  function def(global) {
    var a = 3;
    console.log(a);   
    console.log(global.a);   
  }
    def(window);   // 3  2
    console.log(a);   // 2
})();

立即执行函数只是立即执行一个函数, 实际上就是这样的:

function IIFE2() {};
IIFE2(def);

(function IIFE(){}
) (def);  // JS中的函数也是对象即也可以作为参数

// 立即执行函数里面的函数只执行一次而不作保存
IIFE();  // Error : undefined

参考:MDN 函数

红衣飘飘貌似仙 2022-09-08 20:44:06

第一个问题,foo(o1)因为o1对象含有a这个属性,所以就是在设置a属性的值,这里可以吧a当做一个参数来看待,foo(o2)这里的o2对象并没有a这个属性,所以a = 20就是相当于声明了一个全局变量,所以你在外面访问o2.a时值为undefined,可以看下我写的一个关于with的博客,里面比较详细with的详解

第二个问题,你的顺序搞错了,第一开始输出的3并不是IIFE函数内的console.log,而是下面你传入的函数的第一个console.log,函数是这么跑的,所以IIFE函数内的console.log是最后输出的

第三个问题你这么写不会报错?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文