标签:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script>
//设计一个函数达到这样的效果fun(1)()()每加一个括号传入的值都自动加1,最后输出这个值。谈谈你对重写对象的valueOf,toString后,valueOf,toString调用顺序的理解,以及你对闭包得出理解。
var counterObj = {};
counterObj.count =function(i){
function countInner(){
i++;
return countInner;
}
countInner.valueOf = function(){
console.log(‘valueOf‘);
return i;
}
countInner.toString = function(){
console.log(‘toString‘);
return i;
}
return countInner;
}
var result = counterObj.count(2)()(); //result为countInner函数
result()()();
console.log(result) //这里要显示字符串,因此会先调用countInner的toString方法;但此处输出结果后又调用了valueOf方法,对此不是很理解
//1. 在需要进行表达式运算时会先求值,因此会调用valueOf,如果没有重写valueOf,会调用toString
//2. 在需要进行字符串显示时会调用toString,如果没有重写toString,也不会调用valueOf
//3. 强制使用String(),会调用toString方法,如果没有重写toString,也不会调用valueOf;强制使用Number()会调用valueOf方法,如果没有重写valueOf,会调用toString
//4. 闭包,即函数里面嵌套函数,由于作用域链,内层函数可以访问外层函数的局部变量;通常情况下,当一个函数调用完后,js的垃圾回收机制,会释放函数内部局部变量的内存空间,但是当形成闭包
// 并且将内层函数返回并赋给另一个变量时,此时js垃圾回收机制不知道我们何时会引用此变量,因此不会回收内层函数内引用的外层函数局部变量的内存空间,此时我们可以在函数外面操作函数内部的局部变量。
</script>
</body>
</html>
标签:
原文地址:http://my.oschina.net/u/1992917/blog/412155