作用域和閉包

2021-08-26 18:02:51 字數 2901 閱讀 8061

題目:

知識點:

1、執行上下文

2、this

3、作用域 

4、作用域鏈 

5、閉包

一、執行上下文

ps:函式宣告和函式表示式的區別:

//執行上下文

console.log(a) //undefined

var a = 10

fn('張三',22) //張三 22

function fn(name)

在script標籤內的全域性函式執行之前,如果是函式表示式,會把宣告的變數名拿出來放到最前面,先賦值為undefined,如果是函式宣告則把整個函式放到最前面。同理,在執行第5行的函式時,會先在函式內執行前,先把定義的變數、函式宣告、this和arguments拿出來放到最前面,先賦值為undefined,然後再執行

二、this

//this

var a =

}a.fn() //this === a

a.fn.call() //this ===

var fn1 = a.fn

fn1() //this === window

//建構函式中的this

function foo(name)

var f = new foo('zhangsan')

//物件屬性中的this

var obj =

}obj.printname() //this指向obj

//作為普通函式來執行

function fn ()

fn()//this === window

function fn1(name, age)

// fn1("zhangsan")

fn1.call(, "lisi", 22)

/*第乙個引數是指定this的指向,這裡this指向這個物件

第二個引數是傳入的引數,第二個當引數

也就是說執行fn1時使用call,那麼第乙個引數就是this,就是這麼簡單!

在實際中call更常用

*/function fn2(name, ***)

//bind,不能使用函式宣告,使用bind必須是函式表示式

var fn3 = function fn3(name, age) .bind()

fn3('taiyang', 22)

三、作用域

//無塊級作用域

if(true)

console.log(name)

// //函式和全域性作用域

var a = 100

function fn()

fn()

console.log('global',a)

// 作用域鏈

var a = 200

//// 這個函式在全域性定義,其父級作用域就是全域性作用域

function fn()

fn()

// 父級作用域

var a = 100

// f1函式在全域性定義,其父級作用域就是全域性作用域

function f1()

f2()

}f1()

理解父級作用域:乙個函式的作用域是它定義時候的作用域,如這裡f2的父級作用域就是:哪個函式定義了f2函式,那它的父級作用域就是那個函式,這對理解閉包是很重要的四、閉包

閉包的使用場景

//函式作為引數來傳遞

function f1()

}var f1 = f1()

function f2(fn)

f2(f1)

記住閉包是通過尋找其父級作用域的,而其父級作用域是定義它時的作用域,與執行作用域(如f2函式的作用域)沒有關係,把握這點就不會出錯。閉包通過以上兩個例子,就基本概括了。

解題:1、說一下對變數提公升的理解

主要考查變數提公升和函式宣告(要注意函式表示式對比),即在一段標籤或乙個函式內,在函式執行前,宣告的變數會前置並首先賦值為undefined,如果是乙個函式宣告,則會把整個函式前置,如果是乙個函式表示式,則同其他定義的變數一樣,先賦值為undefined。函式內同理。

2、說明this的幾種使用場景

3、如何理解作用域

關鍵3點:

首先什麼是閉包?《js高階程式設計》是這樣定義的:閉包是指有權訪問另乙個函式作用域中的變數的函式。

在閉包中存在自由變數(即自身函式作用域為宣告的變數),在函式執行時,自由變數會首先從自身作用域中查詢是否存在該變數,如果沒有找到該變數,則會進一步從父級作用域中去尋找,如果在父級作用域中沒有找到,則從父級作用域的父級作用域中去尋找,這樣就構成了作用域鏈,也即自由變數的查詢。父級作用域是指函式定義時的作用域,即函式在哪定義,哪該函式的父級作用域就是哪,注意父級作用域不是執行時的作用域,是函式定義時的作用域。

閉包的兩個使用場景:

函式作為返回值

函式作為引數傳遞

示例如上

4、閉包的實際應用場景

//閉包的實際應用,主要用於封裝變數,收斂許可權

function isfirstload() else

}}var firstload = new isfirstload()

firstload(100)//true

firstload(100)//false

firstload(200)//true

//在isfirstload外無法修改_list的值,因此具有很高的安全性

作用域和閉包

給執行上下文環境下乙個通俗的定義 在執行 之前,把將要用到的所有的變數都事先拿出來,有的直接賦值了,有的先用undefined占個空。全域性 的上下文環境資料內容為 1 普通變數 包括函式表示式,如 var a 10 宣告 預設賦值為undefined 2 函式宣告 如 function fn 賦值...

作用域和閉包

現有宣告後有賦值 宣告在編譯時會提公升位置,提公升時函式會優先變數,如果是同名函式順序排在後面的會覆蓋前面的函式 函式表示式 立即執行的函式表示式 var a 2 function iife global window 塊作用域和閉包 閉包 function foo return bar var b...

作用域 閉包

1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...