第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決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.最后一個問題,我看了網(wǎng)上的不少閉包的文章,但是還是對于閉包這個概念不是太懂,只知道閉包就是里面的函數(shù)可以訪問外面的函數(shù)的成員變量,但是反過來不行,有哪位大神可以舉幾個通俗易懂的例子幫我理解下到底什么事閉包嗎?謝謝各位啦!:D
查看完整描述

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)方法。


查看完整回答
反對 回復(fù) 2018-09-22
  • 1 回答
  • 0 關(guān)注
  • 697 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號