为了账号安全,请及时绑定邮箱和手机立即绑定

总结的内容感觉有点夸大匿名函数的作用

总结的内容感觉有点夸大,说“匿名函数可以有效的保证在页面上写入JavaScript,而不会造成全局变量的污染”我觉得有点故弄玄虚,我认为防止全局变量污染是定义函数和调用函数时考虑,而不是使用匿名函数。

其实js的函数定义和调用就是两句话,这两句也是closure和callback的核心

1、函数定义时决定了这个函数所绑定的scope chain,但这个scope chain里的变量是活的;

2、函数调用时决定了使用scope chain里参数使用什么值。


例如下面这段代码

function fn1(cb){
var fn1_var = "callback";
cb();
}

function fn2(){
function cb(){
console.log(fn1_var);
}
fn1(cb);
}

fn2(); //what's print in console?

执行后台会打印什么?如果你还认为是"callback"就再想想我上面的话,呵呵。


从这个例子也可以看出,不使用匿名函数,函数cb在执行时也访问不到fn1函数中定义的变量,但即使无论你如何用匿名函数,例如下面:

var g ="global";
function fn1(cb){
var fn1_var = "callback";
(function(){cb();})();
}
function fn2(){
function cb(){
console.log(g);
}
fn1(cb);
}
fn2(); //what's print in console?

都必然可以访问到g这个变量,这就是javascript中scope chain的概念。


所以,恕我愚钝,我实在不觉得匿名函数对防止全局变量污染有何作用?倒不是说匿名函数这样写不好,相反教程里的话也让我大受启发,只是对这个说法感觉有点牵强。


很感谢这篇教程,希望教主早点做完

正在回答

3 回答

意思是你把你自己的变量定义的立即执行的匿名函数中,这样就不会与其他开发人员在全局定义的变量相混淆了

0 回复 有任何疑惑可以回复我~

函数运行在被定义的作用域中,而不是被执行的作用域中,本来就是把变量定义到作用域中去使用

1 回复 有任何疑惑可以回复我~

是在匿名函数里去声明需要用到的局部变量,这样的局部变量,匿名函数外面是不可以访问的。你说的这个和人家想表达的完全不是一个意思啊。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

总结的内容感觉有点夸大匿名函数的作用

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信