这个和作用域有关吗?

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

img

因为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();