笔试遇到下面的笔试题;
var foo = {n:1}
!(function (foo) {
console.log(foo.n)
foo.n = 3
var foo = {n:2}
console.log(foo.n)
})(foo)
console.log(foo.n)
1.在浏览器或者在node中代码均报错Uncaught TypeError: {(intermediate value)} is not a function at
需要在立即调用函数前面加上一元操作符"!"
如下代码才能正确运行:
var foo = {n:1}
!(function (foo) {
console.log(foo.n)
foo.n = 3
var foo = {n:2}
console.log(foo.n)
})(foo)
console.log(foo.n)
2.改成1上面的代码后正确运行结果是1,2,3
程序从上到下执行,会先执行立即调用函数,然后在执行立即调用函数下面的console.log(foo.n);
立即调用函数里面的第一个console.log里面的foo是 var foo = {n:1} ,所以立即调用函数里面的第一个console打印1,然后执行到foo.n=3的时候,这个foo引用的对象是跟外部传入foo = {n:1}是同一个引用地址,所有外部的var foo= {n:1}被修改为foo = {n:3};
然而执行到var foo= {n:2}的时候是一个局部变量,最重要的是这个var foo = {n:2}与外部var foo并不是同一个对象,也就是不是同一个引用地址,而且根据变量访问的就近原则,立即调用函数里面的第二个conosle会访问var foo = {n:2}; 所有打印出2,
执行完立即调用函数后开始执行外部的console,然而外部的var foo={n:1},已经被修改为了 var foo = {n:3}