JS - 常見題目

徐海東發表於2019-02-26
  • 函式宣告

var f = function g() {        
    return 23;    
};
typeof g(); // error g is not defined複製程式碼

在javaScript裡,宣告函式只有2種方法

第一種:函式宣告

 function foo(){...}
複製程式碼

第二種:函式表示式

 var foo = function(){...} 
複製程式碼

其他如var f = function bar() {....}等宣告都按第二種方法處理,函式外部無法通過bar訪問到函式,因為是一個表示式

  • 變數回收

以下程式碼存在幾個變數沒有被回收? 

var i = 1;
var i = 2;
var add = function() {    
    var i = 0;    
    return function(){        
        i++;        
        console.log(i);    
    }}();
add();複製程式碼

變數回收規則有三點

1.全域性變數不會被回收

2.區域性變數會被回收,函式執行完後內部的東西都會被銷燬

3.如果變數被另外一個作用域引用就不會被回收

由此可以得知有三個變數沒有被回收,分別是全域性變數i、add 還有閉包中的i

  • 型別轉換

var x = new Boolean(false);
if (x) {  
    alert('hi');
}
var y = Boolean(0);
if (y) {  
    alert('hello'); 
}複製程式碼

輸出: hi複製程式碼

new Boolean 與 Boolean的區別在於:用new呼叫建構函式會新建一個布林物件,所以此處的x為物件,任何物件轉布林值都為true!

而Boolean,此處沒有new, 進行的是顯式轉換,0轉布林值為false

  • javaScript標準事件模型

順序:事件捕獲 -> 事件處理 -> 事件冒泡

描述:先事件捕獲從windows > document 往下級直到特定事件節點,然後進行事件處理,再事件冒泡,從節點往上級冒泡

  • 閉包

var A = {n:4399}
var B = function () {
    this.n = 9999
}var C = function () {
    this.n = 9999
}
B.prototype = A
C.prototype = A

var b = new B()
var c = new C()
A.n++;
console.log(b.n)  // 9999
console.log(c.n)  //  4400複製程式碼

此題考查的是:在查詢 b.n 是首先查詢 b 物件自身有沒有 n 屬性,如果沒有會去原型(prototype)上查詢

當執行 var b = new B() 時,函式內部 this.n=9999(此時this指向b) 返回b物件,b物件有自身的n屬性,所以返回 9999
console.log(c.n);
同理
當執行 var c = new C() 時,c物件沒有自身的n屬性,向上查詢,找到原型 (prototype)上的 n 屬性,因為 A.n++(此時物件A中的n為4400), 所以返回4400


相關文章