1 回答

TA貢獻1826條經驗 獲得超6個贊
你的問題提得很清晰,說明你是經過認真思考了的,那么我也將試著認真一一回答:(序號對應問題答案)。
1.首先你可以認為你定義了一個checkscope函數,加入這是一個工具類,別人需要引用的時候,肯定不知道你內部用了什么變量,這就涉及到一個作用域的問題。至于作用很簡單,就是函數內部可以訪問外部全局變量,函數外部不能直接訪問函數內部局部變量,所以你在用一個模塊的時候不會取到模塊的局部變量,你不妨直接這樣看看:
var scope = 'global scope';function checkscope(){ var scope = 'local scope'; function f(){return scope;} return f(); } checkscope(); alert(scope); // global scope
2.函數內部定義的scope只能在內部調用,但是外部的變量在函數內部可以訪問,你不妨試試把這個改成這樣試試:
var scope = 'global scope';function checkscope(){ function f(){return scope;} return f(); } alert(checkscope());
會發現外部的scope是可以用的,這個地方之所以沒有影響是因為函數內部變量覆蓋了。
3.這個問題問得不錯,其實自己調試一下就知道,如下:
var scope = 'global scope';function checkscope(){ var scope = 'local scope'; function f(){return scope;} return f; }var fn = checkscope();console.log(fn) // "function f(){return scope;}"console.log(typeof fn) // functionconsole.log(fn()) // "local scope"
這個問題之所以不清楚,我覺得是對于函數定義的幾種方式理解不到位:
第一種:function fn(){ // 函數體} 第二種:var fn = function(){ // 函數體} 第三種:var fn = new Function(); 調用的時候都是有()的,fn()。
第二種方式可以認為是講函數賦值給一個變量,因為函數也是對象,你上面例子中返回f,其實可以認為就是類似于函數定義的第二種。
4.你的意思肯定是想問是不是函數作用域中,如果不加var是不是內部變量變成了全局變量,這種情況下是的,但是如果不是函數作用域,比如代碼塊之間,加不加var都可以認為是全局的,所以還是要明確js是函數作用域。
5.至于閉包,這個我覺得還是還是要理解js函數作用域,然后就是匿名函數和閉包的區別,可以看看這篇匿名函數與閉包的區別;然后再看看這一篇吧:學習Javascript閉包。
如果想進一步理解,可以看看我這篇文章中的一部分內容:
JavaScript進階學習(二)—— 基于原型鏈繼承的js工具庫的實現方法。
添加回答
舉報