1、
var a = 10 function foo(){ console.log(a) } function sum() { var a = 20 foo() } sum() /* 输出 10 /
函数 foo()
是在全局下创建的,所以 a
的上级作用域就是 window
,输出就是 10
2、
var n = 10 function fn(){ var n =20 function f() { n++; console.log(n) } f() return f } var x = fn() x() x() console.log(n) /* 输出 * 21 22 23 10 /
思路:fn
的返回值是什么变量 x
就是什么,这里 fn
的返回值是函数名 f
也就是 f
的堆内存地址,x()
也就是执行的是函数 f()
,而不是 fn()
,输出的结果显而易见
3、
// 全局变量 var x = 1; // 对象 var obj = { x: 2, }; // obj.fn = (function (x) { this.x *= x++; //x++ 先返回原值 参加运算 后自++ return function (y) { x += y; this.x *= ++x; //++x 变量先自加1参加运算 后 返回值 console.log(x); }; })(obj.x); // var fn = obj.fn;//自执行函数 返回的函数 obj.fn(2); //6 //调用 返回的函数 obj调用 this指向obj fn(1); //8 //调用返回的函数 全局变量fn调用 this指向window console.log(obj.x, x);//12 16