一道js的面试题,有点凌乱

一道js的面试题,有点乱,大神解释下呗~

var test = (function(a) {
    this.a = a;
    return function(b) {
        return this.a + b;
    }
} (function(a, b) {
    return a;
}(1, 2))); 
console.log(test(4)); //输出什么????
阅读 3.8k
4 个回答

这代码简化之后就是:

var test = function (b) {
    return 1 + b;
};
var test = function (a) {
    this.a = a;
    return function (b) {
        return this.a + b;
    }
}(
    function (a, b) {
        return a;    //->  自执行匿名函数,这一块就是返回个 1
    }(1, 2)
);
//简化
var test = function (a) { //又是一个自执行匿名函数
    this.a = a;//a 就是1  this === window
    return function (b) {
        return this.a + b; //this === window
    }
}(1);
//再简化
var test = function (b) {
    return 1 + b;
};

console.log(test(4)); //输出 5

你可以拆成几部分来看:


var funcA = function(a) {
    this.a = a;
    return function (b) {
        return this.a + b;
    }
}

var funcAB = function (a, b) {
    return a;
}

var test = funcA(funcAB(1, 2))

console.log(test(4));

这里面, funcAB 实际上等同于返回 a,所以又可以精简为:

var test = funcA(1)

test 实际上是接受一个参数,并返回一个匿名函数,而该匿名函数的返回结果为 test的参数与该匿名函数的参数之和。

test(4) = funcA(1)(4) = function(a) {
    this.a = a; // 即 funcA 的参数 4
    return function (b) { // 此处的b即test的参数
        return this.a + b;
    }
}

所以最后的结果为 5

最外层的匿名自执行函数的参数是括号中的返回值。而匿名自执行函数this指向window所以就会有而里面又是个闭包的结构,所以最后会返回的是1+b 而你此时又把4传了进去所以答案会是5

我理解不了 为什么test是一个匿名函数

clipboard.png

推荐问题
宣传栏