javascript是一种我见过的最奇葩、最难学的语言了。基于对象,但是对象的函数不与对象绑定。请看下面的例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>证明js的函数不与作用域绑定</title>
</head>
<body>
<script>
var theAccumulator = {
total: 0,
clear: function () {
},
clear: function () {
this.total = 0;
},
add: function (x) {
this.total += x;
},
getResult: function () {
return this.total;
}
};
theAccumulator.clear();
theAccumulator.add(1);
theAccumulator.add(2);
function printResult(func) {
console.log(func());
}
printResult(theAccumulator.getResult);//输出undefined
</script>
</body>
</html>
java程序员肯定困惑不已,感觉整个人都不好了。原因就是javascript是基于调用时的作用域查找参数的,也就是我们常说的作用域链。当把getResult函数作为参数传入printResult函数时,getResult函数并没有任何的上下文。
如果改成这样:
printResult(function(){
return theAccumulator.getResult() ;//输出3
});
输出就正常了。因为此时getResult函数绑定了上下文。