function fn(){
var b = 8;
this.ff = function(){
nn(b);
};
var nn = function(b){
if(b == 8){
b = 9;
}else{
console.log(b); //为啥一直不执行这里
};
};
};
var a = new fn();
a.ff();
a.ff();
a.ff();
我给你理一下逻辑啊
你下面a等于那个fn的方法,你a。ff就是调用这个fn方法内的ff方法。
所以你的执行顺序就是先执行fn方法,然后 var b = 8;这时候你把b赋值为8了
然后你又执行了ff调用了nn。nn里面判断b是否等于8,那这时候你上面都从新赋值为8了,肯定是8啊。所以就一直执行if内的把b赋值9.不会执行else内的log
你下次在调用,又把b赋值为了8.继续执行if内的操作。
明白了吗
因为这个一直是8
因为nn函数中的b是js引擎为你隐式声明的变量,js引擎会将这个变量的引用指向你在fn函数声明的b,又因为你在fn函数声明的变量b是基本数据类型,所以你在nn函数中修改值是不会修改你在fn函数中声明的b的值的。
你将b修改成引用数据类型如对象即可解决问题。
function fn() {
var obj = {
b: 8
};
this.ff = function() {
nn(obj);
};
var nn = function(b) {
if (b.b == 8) {
b.b = 9;
} else {
console.log(b); //为啥一直不执行这里
};
};
};
var a = new fn();
a.ff();
a.ff();
a.ff();