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

来源:1-5 立即调用表达式

Kursk_ye

2014-11-12 16:28

总结的内容感觉有点夸大,说“匿名函数可以有效的保证在页面上写入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回答

  • 慕粉2394017
    2019-03-14 22:05:44

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

  • qq_Z咸蛋超人_04074723
    2017-04-13 16:16:55

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

  • hidoos
    2014-12-07 01:14:27

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

jQuery源码解析(架构与依赖模块)

由浅入深地剖析jQuery库的设计与实现,揭开框架背后的秘密

84047 学习 · 280 问题

查看课程

相似问题