基础概念:定义函数的方式
一般定义函数有两种方式:
1:函数的声明
2:函数表达式
自执行函数
我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。
自执行函数,即定义和调用合为一体。
(function(){
return typeof arguments; //"object"
})();
arguments 实参的集合 返回是object,
函数的返回类型有6中:
字符串(String),数字类型number),boolean,undefined,object,function
var f=function g(){return 23;}
typeof g();//error
JavaScript的函数声明与函数表达式的区别
1.函数声明:
function funDeclaration(type){
return type==="Declaration"
}
2.函数表达式:
var funExpression =function(type){
return type==="Expression"
}
区别:
javascript中函数声明在js解析时就进行函数提升,因此在同一个作用域内,
不管函数在哪里定义,该函数都可以进行调用;而函数表达式的值是在js运行时确定,
并且在表达式赋值完成后,该函数才能调用;
举个例子:
函数声明:
funDeclaration("Declaration"); //=> true
function funDeclaration(type){
return type==="Declaration";
}
函数表达式:
funExpression("Expression"); //=>error
var funExpression = function(type){
return type==="Expression";
}
出现上面错误的原因是因为函数声明时创建的函数可以在函数解析后调用;而函数表达式
创建的函数是在运行时进行进行赋值,且要等到表达式赋值完成后才能调用。其本质原因
在这两种类型在函数提升和运行时上的差异,如下图:
image.png
(function(x){
delete x; //delete 只能删除对象中的属性,不能删除变量,也不能删除参
数,这里的x是参数
return x;
})(1) // 1
var y=1,x=y=typeof x;
x; // "undefined"
(function(f){
return typeof f();
})(function(){return 1;}) //"number"
this 指向问题
var foo={
bar:function(){return this.baz},
baz:1
};
(function(){
return typeof arguments[0](); //this 是谁调用的,这里是window,window下没用baz,所以为undefined
})(foo.bar)//"undefined"
var foo={
bar:function(){return this.baz},
baz:1
}
typeof(f=foo.bar)(); // "undefined" 同上
var f=(function f(){return "1";},function g(){return 2;})()
typeof f; //"number" 分组选择符,后者会替换掉前者;
var x=1;
if(function f(){}){ // 函数声明不能写在运算符的运算中,写进去之后名字会找不到,
//但这里if还是会执行,返回真,返回假的:false,null,'',0,除此之外,返回真,这里是一个空的函数
x+= typeof f;
}
x; //"1undefined"
var x=[typeof x,typeof y][1];
typeof typeof x; //typeof 一个字符串还是字符串类型,即string
(function(foo){
return typeof foo.bar;
})({foo:{bar:1}}) //"undefined" 找不到bar属性
(function f(){
function f(){return 1;}
return f();
function f(){return 2;}
})();//闭包自执行 2
function f(){return f;}
new f() instanceof f; //false
//函数的长度就是函数的形参
with (function(x,undefined){}) length; //2
网友评论