JS - 常见题目

  • 函数声明

var f = function g() {        
    return 23;    
};
typeof g(); // error g is not defined复制代码

在javaScript里,声明函数只有2种方法java

第一种:函数声明windows

function foo(){...}
复制代码

第二种:函数表达式bash

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();复制代码

变量回收规则有三点ui

1.全局变量不会被回收this

2.局部变量会被回收,函数执行完后内部的东西都会被销毁spa

3.若是变量被另一个做用域引用就不会被回收prototype

由此能够得知有三个变量没有被回收,分别是全局变量i、add 还有闭包中的icode

  • 类型转换

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
相关文章
相关标签/搜索