来自你不知道的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中的三种显示依次如下:
第二个问题可以变成这样(你代码的注释顺序错了,不是按代码顺序输出,而是按执行顺序),def函数先执行:
立即执行函数只是立即执行一个函数, 实际上就是这样的:
参考:MDN 函数