(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 这是为什么??
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
在全局作用域定义一个able = 33, 结果会弹出33。你可以试一下
建议看看《你不在知道的js》对闭包作用域的解惑。
这个里面, 你是先定义一个函数function(fn){...},它接受一个函数作为参数。 你传递的参数是
这里访问不到able啊, 因为able是前一个函数的局部变量。
而
这里, able定义在之前, 所以内部函数
可以访问到。
有问题那段代码,可以拆解成
很明显,
able是在func1中定义的,但却是在func2中使用的,在func2中肯定找不到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
这段代码本意是要访问匿名立即执行函数
able,但是able作用域并不包含function(){alert(able)},因为这个函数并不是在匿名立即执行函数里。