(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)
}
可以访问到。