求问Js里面toString的一个妙用的原理

function add(x){
    var num = x;
    function _add(para){
        num+=para;
        return _add;
    }
    _add.toString=function(){
        return num;
    }
    return _add;
}


var a = add(1)(2)(3);
console.log(a);//6
console.log((a+7));//13
console.log(a(11));//17

如代码区这个时候a,它既可以是个变量,又可以当做是个函数名来直接调用,比如继续a(11);结果是17。
toString方法我知道是复写了原型链上面的方法。
可是为什么赋值的时候a会赋值到这个toString呢?

阅读 2.7k
2 个回答

有一点你说的有点问题调用 a(11)的结果是一个函数,而不是结果17

console.log(typeof a(11))
// function

所以问题出在了console.log身上,console.log函数需要把变量转换成字符串打印,所以会首先调用变量的toString方法的,你把_add.toString换成_add.log再试试就不会自动打印出结果了,就会是函数了,除非再手动调用log

function add(x){
    var num = x;
    function _add(para){
        num+=para;
        return _add;
    }
    _add.log=function(){
        return num;
    }
    return _add;
}


var a = add(1)(2)(3);
console.log(a);
a.log()

补充一下案例 在执行a+7的时候 会自动调用toString 以下展示了这个情况

var a = function() {return 3}
a + 7
// "function () {return 3}7"
a.toString = function() {return 3}
a + 7
// 10
新手上路,请多包涵

不知道答主大佬现在知道为啥了没
刚才翻到一位大佬的链接才恍然大悟
附上大佬原文:toString方法的作用是不用多说的了,这个JavaScript内置方法还有一个特性是:在执行一些特殊方法的时候,比如alert或innerHTML等方法,它将由脚本解析器自动调用
https://www.jb51.net/article/...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题