一道经典的this面试题(复杂度两颗星)面试
【JS脚丫系列】segmentfault
看一道题,控制台打印出来的值是什么?闭包
var number = 5; var obj = { number: 3, fn1: (function () { var number; this.number *= 2; number = number * 2; number = 3; return function () { var num = this.number; this.number *= 2; console.log(num); number *= 3; console.log(number); } })() } var fn1 = obj.fn1; fn1.call(null); obj.fn1(); console.log(window.number);
下面的分析过程由我(吃码小妖)捋了一遍。app
有一点点绕,能判断过程就能够了。函数
【01】首先匿名自执行函数运行后,变为this
var number = 5; var obj = { number: 3, fn1: function () { var num = this.number; this.number *= 2; console.log(num); number *= 3; console.log(number); } }
此时:code
this.number *=2 ;//this为window,因此window.number =10;对象
number = number*2; //那么,number 为NaNget
number= 3;//number为3。io
SO:
window.number =10
number =3
【02】var fn1 =obj.fn1;
那么 fn1 就是 function(){ var num = this.number; //...}
【03】fn1.call(null) ;
若是将 null 或者是 undefined 做为 this 的绑定对象传入 call、apply 或者是 bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。
等同于运行下面的函数:
function () { var num = window.number; window.number *= 2; console.log(num); number *= 3; console.log(number); }
而后:
var num = window.number;//num =10; window.number *= 2; // window.number = 20; console.log(num); //10 number *= 3; //3*3 = 9; console.log(number);//9
SO:
num =10;
number =9;
window.number =20;
输出了10,9
【04】obj.fn1();
等同于运行:
fn1: function () { var num = this.number; this.number *= 2; console.log(num); number *= 3; console.log(number); }
此时:this为obj对象。
var num = this.number; // num = 3; this.number *= 2; //obj.number*2=6 console.log(num);//3 number *= 3;// number = 27; console.log(number);//27
【05】console.log(window.number);
输出20便可。
【06】最后结果:
//10 //9 //3 //27 //20
以为这题很不错,考察了多个知识点。因此推荐给你们。