題目:
知識點:
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 函式作用域...