總結的內容感覺有點夸大匿名函數的作用
總結的內容感覺有點夸大,說“匿名函數可以有效的保證在頁面上寫入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的概念。
所以,恕我愚鈍,我實在不覺得匿名函數對防止全局變量污染有何作用?倒不是說匿名函數這樣寫不好,相反教程里的話也讓我大受啟發,只是對這個說法感覺有點牽強。
很感謝這篇教程,希望教主早點做完
2019-03-14
意思是你把你自己的變量定義的立即執行的匿名函數中,這樣就不會與其他開發人員在全局定義的變量相混淆了
2017-04-13
函數運行在被定義的作用域中,而不是被執行的作用域中,本來就是把變量定義到作用域中去使用
2014-12-07
是在匿名函數里去聲明需要用到的局部變量,這樣的局部變量,匿名函數外面是不可以訪問的。你說的這個和人家想表達的完全不是一個意思啊。