1. 程式人生 > >js面試題知識點全解(一作用域和閉包)

js面試題知識點全解(一作用域和閉包)

foo true 方式 聲明 提升 function 這樣的 all 變量提升

問題:

1.說一下對變量提升的理解

2.說明this幾種不同的使用場景

3.如何理解作用域

4.實際開發中閉包的應用

知識點:

js沒有塊級作用域
只有函數和全局作用域,如下代碼:

if(true){
        var name=‘killua‘ //把name定義在塊裏和放在外面是一樣的,等同於在外面聲明一個變量name,在塊內給name賦值
    }//同等於下面的代碼
    //建議用下面方式寫
    var name
    if(true){
        name=‘killua‘
    }
    console.log(name) //打印出來killua

    //函數和全局作用域
var a=100 //定義全局作用域變量 function fn(){ var a=200 //在函數中定義變量不會汙染外面定義的變量,只能函數裏面用 console.log(‘fn‘, a) }

當前作用域沒有定義某個變量,所以要去它的父級作用域找,這樣的就是作用域鏈

//作用域鏈例子1
var a = 100 //自由變量
function fn(){
    var b = 200
    console.log(a) 
    console.log(b)
}
fn()
//作用域鏈例子2
var x =100
function F1(){
    var y = 200
    function
F2(){ var z =300 console.log(x) console.log(y) console.log(z) } F2() } F1()

作用域和閉包-執行上下文

console.log(a); //undefined
var a=10;  //這種寫法,因為a是全局變量。會把var a;提到最前面
/*以上代碼等同於:
var a;
console.log(a);
a=10;*/

fn("killua");
function fn(name){
    console.log(name)
}  //函數聲明會提前到最前面,所以可以先執行函數,再聲明函數也可以
fn(‘killua‘) function fn(name){ console.log(this) // console.log(arguments) //參數 age=10 console.log(name, age) var age bar(100) function bar(num){ console.log(num) } //在函數內也會把函數聲明,變量聲明提到函數內部最前面 } //函數執行完輸出 //killua 10 //100

this介紹:

this要在執行時才能確認,定義時無法確認

var a= {
    name = ‘killua‘,
    fn: function(){
        console.log(this.name)
    }
}
a.fn() //this===a

a.fn.call({name:‘L‘}) //this==={name:‘L‘}

var fn1 =a.fn
fn1() //this===window

構造函數中的this

1 function Foo(name){
2     this.name = name
3 }
4 var f = new Foo(‘killua‘) //實例化

對象中的this

1 var obj = {
2     name:‘L‘
3     printName: function(){
4         console.log(this.name)
5     } 
6 }
7 obj.printName() //作為對象屬性來執行,this指向obj這個對象

普通函數中的this

1 function fn(){
2     console.log(this) //作為一個普通函數執行,this === window
3 }
4 fn()

call apply bind

1 function fn1(name,age){
2     console.log(this)
3 }
4 fn1.call({x:10},"killua",20) //call調用一個對象的一個方法,以另一個對象替換當前對象,這裏把this替換成{x:10}
5 fn2.apply({x:10},[‘killua‘,20]) //apply和call方法一樣,只是用數組的方式傳遞參數,call比較常用
6 var  fn3 = function(name,age){
7     console.log(this)
8 }.bind({y:200}) //.bind()方法和前兩個一樣,把this替換成{y:200},但是必須用在函數表達式,不能用在普通函數
9 fn3(‘killua‘,20)

以上知識點總結出題目內容

說一下對變量提升的理解:
1.變量定義 //變量聲明會提前
2.函數聲明(註意和函數表達式的區別) //函數聲明提升

說明this幾種不同的使用場景:
1.作為構造函數執行
2.作為對象屬性執行
3.作為普通函數執行
4.call apply bind

如何理解作用域:
1.自由變量
2.作用域鏈,即自由變量的查找
3.閉包的兩個場景(持續更新中...)

js面試題知識點全解(一作用域和閉包)