关于with, 立即执行函数表达式和 let的三个问题??
来自你不知道的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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
第二个问题可以变成这样(你代码的注释顺序错了,不是按代码顺序输出,而是按执行顺序),def函数先执行:
立即执行函数只是立即执行一个函数, 实际上就是这样的:
参考:MDN 函数
第一个问题,
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
是最后输出的第三个问题你这么写不会报错?