前端面试题:企业面试真题—11

var x = 20;
var a = {
    x : 15,
    fn : function(){
        var x = 30;
        return function(){
            return this.x;
        }
    }
};
console.log(a.fn());  //function(){ return this.x; }
console.log((a.fn())());  //20
console.log(a.fn()());   //20
console.log(a.fn()() == (a.fn())());  //true
console.log(a.fn().call(this));  //20
console.log(a.fn().call(a));  //15

 

解析

var x = 20;
var a = {
    x : 15,
    fn : function(){
        var x = 30;
        return function(){
            return this.x;
        }
    }
};
console.log(a.fn());  //该函数返回值就是一个函数, 打印结果function(){ return this.x; }
console.log((a.fn())()); //就是把第一行得到的函数调用了, 相当于匿名函数直接调用,this指向window,那么x等于20  
console.log(a.fn()()); //跟上面一行没有区别,就是少了括号,并没有影响执行顺序
console.log(a.fn()() == (a.fn())());  //跟上面的一样, 两次的执行结果相同
console.log(a.fn().call(this));  //利用call来调用这个匿名函数, 由于全局的this指向window,相当于call(window),最终结果还是20  
console.log(a.fn().call(a)); //call方法将this指向了a对象,最终this.x就是a.x,结果是15

 

你可能感兴趣的:(WEB前端集中营)