javascript - 關于具名的IIFE內(nèi)部對函數(shù)自身再賦值問題?
問題描述
+function foo(){foo=10;//我的問題代碼 console.log(foo);//方法自己}();console.log(typeof foo);//undefined 觀察是否全局污染
我想問 函數(shù)foo內(nèi)部對foo再賦值的這個10去哪了,還有同名函數(shù)foo是如何阻止全局污染的,求解求擴展
問題解答
回答1:題主能問這個,可以的.不過這題能通過自己實踐解決掉...
首先題主對于IIFE的寫法沒問題,IIFE的寫法好多,常見的就是@ewind說的這個和:
(function(){}())
還有不常見的:
!function(){ /* code */ }();~function(){ /* code */ }();-function(){ /* code */ }();+function(){ /* code */ }();
然后再說代碼:在函數(shù)里給當前函數(shù)名賦值時:foo = 10; 無效.(贊同@ewind,這里會忽略,應該有更合理的說法.)JS解析器會忽略掉它.我在Chrome控制臺執(zhí)行的結(jié)果是:
function foo(){ foo=10;//我的問題代碼 console.log(foo);//方法自己}undefined// 上面typeof foo的結(jié)果
這就證明了上面我說的忽略.然后因為IIFE模擬了塊作用域,外部環(huán)境訪問不了內(nèi)部的變量.所以就是undefined.
@ewind說因為foo是匿名函數(shù)然后怎樣怎樣.明顯概念搞混了.foo函數(shù)并不是匿名函數(shù).
function [name]([param] [, param] [..., param]) { statements }name函數(shù)名,可以省略。當省略函數(shù)名的時候,該函數(shù)就成為了匿名函數(shù)。
MDN
回答2:首先,貼出的代碼是不完整的。完整版應該是這樣
(function foo(){ foo = 10 console.log(foo) // [Function: foo]})();console.log(typeof foo) // undefined
這確實看起來比較反直覺,因為沒有采用 var 聲明的 foo 并沒有污染全局作用域。
但如果函數(shù)內(nèi)聲明的變量名不是 foo,就很符合直覺了,如下:
var bar = 1;(function foo(){ bar = 10})();console.log(typeof foo) // undefinedconsole.log(bar) // 10
所以為什么函數(shù)內(nèi)聲明的變量和函數(shù)名同名時,會發(fā)生問題呢?可以看這個示例:
(function foo(){ console.log(foo) // [Function: foo] console.log(arguments.callee) // [Function: foo] console.log(foo === arguments.callee) // true})();
在立即執(zhí)行的函數(shù)帶有 foo 這一函數(shù)名后,調(diào)用時的 arguments.callee 其實就是對 foo 的引用了。比較二者可以發(fā)現(xiàn)此時 foo 就是函數(shù)對象。此時賦值操作并不能生效,遇到未加 var 聲明的 foo 變量時,解釋器查找到的也是這個函數(shù)對象,從而不會在全局作用域下產(chǎn)生污染。
相關文章:
1. linux - Ubuntu下編譯Vim8(+python)無數(shù)次編譯失敗2. java - 在搭建ssm的過程中 用junit測試Dao層 怎么樣都報錯 說連接不上jdbc3. javascript - 如何判斷用戶切換到了當前標簽頁?4. java - Mybatis關聯(lián)查詢5. css - 移動端 盒子內(nèi)加overflow-y:scroll后 字體會變大6. java - 新手做一個安卓視頻播放器,想實現(xiàn)一個進度條,按鈕那種在視頻下方懸浮的功能,不知道思路!7. javascript - webpack 報錯 新人 求解8. javascript - H5頁面怎么查看console信息?9. nginx bind failed10. 前端 - CSS3 box-shadow如何設置,或者用什么方法可以產(chǎn)生圖中這樣陰影的效果。
