js面试题知识点全解(一作用域)
生活随笔
收集整理的這篇文章主要介紹了
js面试题知识点全解(一作用域)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題:
1.說一下對變量提升的理解
2.說明this幾種不同的使用場景
3.如何理解作用域
4.實際開發中閉包的應用
知識點:
js沒有塊級作用域
只有函數和全局作用域,如下代碼:
當前作用域沒有定義某個變量,所以要去它的父級作用域找,這樣的就是作用域鏈
//作用域鏈例子1 var a = 100 //自由變量 function fn(){var b = 200console.log(a) console.log(b) } fn() //作用域鏈例子2 var x =100 function F1(){var y = 200function F2(){var z =300console.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=10console.log(name, age)var agebar(100)function bar(num){console.log(num)} //在函數內也會把函數聲明,變量聲明提到函數內部最前面 } //函數執行完輸出//killua 10//100this介紹:
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.閉包的兩個場景
轉載于:https://www.cnblogs.com/chooper/p/7417865.html
總結
以上是生活随笔為你收集整理的js面试题知识点全解(一作用域)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 1646 Edge Case
- 下一篇: poj3279 Fliptile