標籤:面試 定義 不同 prevent str def htm his 執行
1、問題代碼:
var length = 10;function fn(){ console.log(this.length);}var obj = { length:5, method:function(fn){ fn(); arguments[0]() }}obj.method(fn,1);//輸出10 2
解答:第一個fn執行的this是指向window 的所以this.length指的是10 而arguments[0]()可以理解為下面代碼 這裡的length是arguments本身的自己的length屬性
var arguments = { 0:fn, 1:1, . . . length:2 }
2、問題代碼
var obj = { getName:function(){ console.log(this) }}obj.getName();//obj(obj.getName)();//obj(obj.getName = obj.getName)()//window
解答: 第一個很明顯 getName執行的this是obj 第二個不是很理解 大概理解為obj.getName是一個整體 自執行函數執行 也就是getName執行 所以 跟第一個一樣 也是obj
第三個可以這麼理解 兩邊賦值之後的結果為function (){console.log(this)} = function (){console.log(this)} 所以此時執行的this是代表window(第二個希望有會的可以評論講解一下 謝謝)
題目1:說一下對變數提升的理解
答案:使用var定義的變數或者函數運算式在代碼執行的時候 會先進行變數提升(聲明) 即先賦值為undefined;而函式宣告 會同時定義和聲明
題目2:說明this幾種不同的使用情境
答案:作為建構函式執行 作為對象屬性執行 作為普通的函數執行 call apply bind
題目3:建立10個<a>標籤,點擊的時候彈出來對應的序號
答案:這裡主要通過自執行函數來擷取每次迴圈的時候的i值
var i,a;for(i = 0;i<10;i++){ (function(i){ a = document.createElement(‘a‘); a.innerHTML = i+‘<br>‘; a.addEventListener(‘click‘,function(e){ e.preventDefault(); alert(i); }) document.body.appendChild(a); })(i)}
題目4:如何理解範圍
答案:函數執行的時候 就會建立一個私人的範圍供裡面的代碼執行。當函數裡面要訪問變數的時候,首先會在自己的範圍當中進行尋找,如果找不到會到其父級的範圍中繼續尋找,這就形成了一個範圍鏈。
題目5:實際開發中閉包的應用
答案:延長變數的生命週期,可以是函數外面訪問函數內部的變數。
js面試題-----範圍與閉包