引用数据类型函数
1.通过构造函数new Function() 不论有木有给函数取名 函数的name均为anonymous
2.特例;
function f1() {};
var f2=f1.bind(null);
console.log(f2.name);//"bound f1"
3.函数的length属性:一般情况下函数的length为形参的个数,但是当给函数的形参赋默认值的时候需要注意
4.关于函数的默认值:只有当给函数实参为undefined的时候才会走默认值
变量提声
1.函数执行的顺序:当浏览器执行一段代码时:先找var(只声明) function(既声明又赋值),然后在执行代码
全局作用域:整个代码 window
局部作用域:带有function关键字的
块级作用域(ES6新增):带有 { } 的
注意:
console.log(eval("({a:1,b:2})"));
console.log(a);//undefined
console.log(b);//undefined
var b=1;
ff();
function ff() {
console.log(1);
}
console.log(b);
2.在if条件中,不管条件真假,var和function都会先提声,但是function不会赋值,只有当if语句条件为真时,才会给function赋值
console.log(a);//undefined
console.log(F);//undefined
if(true){
console.log(a);//undefined
console.log(F);
var a=1;
function F() {}
}
3.等号右边没有变量提声
console.log(ff);//ff is not defined
var f=function ff() {
}
变量重名
ff(); //2
var ff;
ff(); //2
function ff() {
console.log(2);
};
var ff=function () {
console.log(1);
};
ff(); //1
总结:1.先找函数体中的var和function 然后会给function堆内存(只要是带 { } 都会给与一个堆内存),然后从上而下执行代码,遇到私有作用域的时候 如果私有作用域没有定义 则在全局中去找 如果全局中还是没有,则是undefined。数组也会给与一个堆内存然后以地址的形式赋值。
2.function定义的是私有作用域 { }、if(){} 、for(){}、 while(){}等定义的是块级作用域
3.在块级作用域中,var和function定义的变量名不能相同