javascript - 请看下面两段js代码,我懵逼了
伊谢尔伦
伊谢尔伦 2017-04-11 12:32:12
[JavaScript讨论组]
(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 这是为什么??

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(6)
怪我咯
(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》对闭包作用域的解惑。

PHP中文网
(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)
    }

可以访问到。

大家讲道理

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

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没有任何关系,而是一个全局变量,但是这个变量没有定义,故报错

大家讲道理

你可以去看看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)},因为这个函数并不是在匿名立即执行函数里。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号