首页 > 请看下面两段js代码,我懵逼了

请看下面两段js代码,我懵逼了

(function(fn){
     var able=123;
     function tmp(){
         fn()
     };
     return tmp();
 })(function(){alert(able)});

报错;但是:


(function(fn){ 
    var able=123;
    function tmp(){
        (function(){
            alert(able)
        })();
    };
    return tmp()
})();

弹出123 这是为什么??


你可以去看看js参数传递规则,值(value)和引用(reference)
基本类型按值传递:
obj类型按引用传递:
你写的第一种方式实际上并没有把函数体传进去,只是传递了一个引用地址,而你在该函数中并没有定义able变了,所以会出现 not defined。


这个问题我找了好几天。。
https://toddmotto.com/everyth...
这一句:any function defined within another function has a local scope which is linked to the outer function

(function(fn){
     var able=123;
     function tmp(){
         fn()
     };
     return tmp();
 })(function(){alert(able)});

这段代码本意是要访问匿名立即执行函数able,但是able作用域并不包含function(){alert(able)},因为这个函数并不是在匿名立即执行函数里。


有问题那段代码,可以拆解成

var func1 = function(fn) {
     var able=123;
     function tmp(){
         fn()
     };
     return tmp();
};

var func2 = function(){
    alert(able)
};

(func1)(func2);

很明显,able 是在 func1 中定义的,但却是在 func2 中使用的,在 func2 中肯定找不到 able 啊,不在一个作用域嘛。


var able="me";
(function(fn){
     var able=123;
     function tmp(){
         fn()
     };
     return tmp();
 })(function(){alert(able)});

对able定义会发现弹出me,说明function(){alert(able)中的able和var able=123没有任何关系,而是一个全局变量,但是这个变量没有定义,故报错


(function(fn){

 var able=123;
 function tmp(){
     fn()
 };
 return tmp();

})(
//这段代码相当于一个参数,当它直接调用,会默认为全局作用域,但是全局并没用定义,所以会报错
// Uncaught ReferenceError: able is not defined(作用域的错误)
function(){alert(able)}
);

在全局作用域定义一个able = 33, 结果会弹出33。你可以试一下

var able = 33;
(function(fn){

 var able=123;
 function tmp(){
     fn()
 };
 return tmp();

})(
//这段代码相当于一个参数,当它直接调用,会默认为全局作用域,但是全局并没用定义,所以会报错
// Uncaught ReferenceError: able is not defined(作用域的错误)
function(){alert(able)}
);
//这个并没有传递参数,直接调用
(function(fn){

var able=123;
function tmp(){
    (function(){
    //这里是闭包能访问外层作用域 即able = 123,所以可以弹出
        alert(able)
    })();
};
return tmp()
})();

建议看看《你不在知道的js》对闭包作用域的解惑。


(function(fn){

 var able=123;
 function tmp(){
     fn()
 };
 return tmp();
})(function(){alert(able)});

这个里面, 你是先定义一个函数function(fn){...},它接受一个函数作为参数。 你传递的参数是

function(){alert(able)}

这里访问不到able啊, 因为able是前一个函数的局部变量。

(function(fn){

var able=123;
function tmp(){
    (function(){
        alert(able)
    })();
};
return tmp()
})();

这里, able定义在之前, 所以内部函数

function(){
        alert(able)
    }

可以访问到。

【热门文章】
【热门文章】