- 函数声明
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