js return一个函数会得到什么?

执行? string? function?

Posted by AllocatorXy on February 13, 2017

return function

偶然发现,js在return时,返回的是函数的情况,这个函数并没有执行;

function a() {
    console.log('msg0');
    return function () {
        console.log('msg1');
    };
}
a(); // console: msg0

用res接收a函数的返回值,发现得到了返回函数的代码;
那么,这个返回函数没有被执行的原因,难道是因为被转化成了一段字符串

function a() {
    console.log('msg0');
    return function () {
        console.log('msg1');
    };
}
let res = a(); // console: msg0
alert(res);    // function () {console.log('msg1');}

查看res的类型,发现是function,并没有被转换成字符串;
看来,这个return只是返回了这个匿名函数对象,return没有触发这个函数;

function a() {
    console.log('msg0');
    return function () {
        console.log('msg1');
    };
}
let res = a(); 
alert(typeof res); // function
// res: function () {console.log('msg1');}

验证猜想,果真如此,返回值不管是数字还是函数,都没有被转成字符串,而是传回了number;
但return并不会触发函数,如果非要返回的函数执行,需要手动执行;

function a() {
    console.log('msg0');
    return function () {
        console.log('msg1');
        return 1;
    };
}
let res = a()();       // 将返回值直接执行 -> console: msg0 msg1
alert(res);            // 1
alert(typeof res);     // number

后来发现,对象s并没有被隐式转换,console.log打印出来是对象
可是alert不知道为什么变成了‘msg’;

let s = 'msg';
String.prototype.a = function() { // string原型函数返回this
    return this;
};
console.log(typeof s.a());  // object
console.log(s.a());         // String {0: "m", 1: "s", 2: "g", length: 3, [[PrimitiveValue]]: "msg"}
alert(s.a());               // msg