1 回答

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