0x00 函数
·函数的实参数可以大于形参数,按照实参的顺序赋值给形参,多余的忽略;
·若函数的实参数小于形参数,则未赋值的形参值为undefined;
·函数如果没有return则返回undefined;
·arguments是函数的一个内置对象,其中储存了传递的所有实参;
·arguments是伪数组,它可以按照索引并获取值并且有length这个属性,但是它没有数组的一些方法,如pop();
0x01 作用域
es5的作用域为函数作用域和全局作用域,但是有个问题,就是函数作用域会覆盖全局作用域,例子如下
<script>
var a = 1;
var fn = () => {
console.log(a);
if(-1){
var a = 3;
}
}
fn();
</script>
执行fn()输出的并不是1,而是undefined,这是因为在函数中函数作用域覆盖了全局作用域。
还有一个缺点就是循环中的变量泄露为全局变量
针对以上情况,es6标准定义了块级作用域,使用let定义,外层作用域无法访问到内层作用域,这样上面所述的情况变得到了解决
<script>
let a = 1;
let fn = () => {
console.log(a);
if(-1){
let a = 3;
}
}
fn();
</script>
0x02 函数作用域
·在函数内部直接赋值没有声明得变量也是全局变量
·在es5中内部函数访问外部函数采取的是链式查找的方式决定取哪个值
<script>
var num = 10;
var fn = () => { // 外部函数
var num = 20;
var fn1 = () => { // 内部函数
console.log(num);
}
}
fn();
</script>
在本案例中输出的num为20,也就是按照链式查找的方法来取num的值
0x03 预解析
·Js引擎执行代码分为两步,第一步是预解析,第二步才是执行代码
·Js预解析会将当前作用域的var function提到作用域的最前面
·Js预解析分为两个部分,变量提升(预解析)和函数(预解析)
·变量解析和函数解析都是将声明提前到当前作用域的最前面,注意只是提升声明
经典面试题
<script>
fn1();
console.log(c);
console.log(b);
console.log(a);
function fn1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
</script>
注意,这里的var a = b = c = 9;相当于var a = 9;b = 9; c = 9;所以b,c为全局变量,这里只定义了一个var。
0x04 构造函数
·构造函数的首字母要大写
·构造函数不需要return即可返回结果
·调用构造函数必须使用new
·利用构造函数创建对象的过程叫做对象的实例化
经典面试题-new一个对象做了哪几件事
①在内存中创建一个新的空对象;
②this指向空对象
③执行构造函数中的代码,为这个对象附上属性和方法;
④返回这个对象
0x05 对象遍历
对象遍历可以使用for..in
<script>
let obj1 = {
name : 'a',
sex : '男',
Hi : () =>{
console.log('hi~my name is a');
}
}
for (let k in obj1){
console.log(k);
console.log(obj1[k]);
}
</script>