JS - 常见题目

331 阅读2分钟
  • 函数声明

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