亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js閉包的一個問題

js閉包的一個問題

qq_笑_17 2018-08-03 11:10:02
先上代碼:var scope = 'global scope';function checkscope(){    var scope = 'local scope';    function f(){return scope;}    return f(); } checkscope();輸出:local scope如果把這段代碼改一下,把里面的括號移動到外面:var scope = 'global scope';function checkscope(){    var scope = 'local scope';    function f(){return scope;}    return f; } checkscope()();輸出:local scope我的問題:1.這段代碼到底是要干什么?2.為什么代碼會返回local scope而不是global scope?3.為什么把f后面的()移動到外面還是返回一樣的值?f沒了括號,return f是什么意思呢?4.js里面是不是只要是var申明的都是局部變量,沒有var的都是全局變量?5.最后一個問題,我看了網上的不少閉包的文章,但是還是對于閉包這個概念不是太懂,只知道閉包就是里面的函數可以訪問外面的函數的成員變量,但是反過來不行,有哪位大神可以舉幾個通俗易懂的例子幫我理解下到底什么事閉包嗎?謝謝各位啦!:D
查看完整描述

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工具庫的實現方法。


查看完整回答
反對 回復 2018-09-22
  • 1 回答
  • 0 關注
  • 689 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號