var funcExpre = function () {
var x = "Hello!!";
console.log(x);
return 3;
}();
console.log(funcExpre);
(function fn() {
var x = "Hello!!";
console.log(x);
return 3;
})();
function定义部分的括号不可省,不能写成function(){}()这种格式。不然就会报错
function fn() {
var x = "Hello!!";
console.log(x);
return 3;
}();
自调用函数也可称之为”立即执行函数“,函数执行完函数空间就被释放,不能再被访问,但函数返回值可以被保存。故这种调用方法多是针对初始化功能的函数,即函数只执行一次的情况。
(function fn() {
var x = "Hello!!";
console.log(x);
return 3;
})();
fn()
结果:函数自调用执行之后(打印出字符串hello),报错fn is not defined
上例验证了,被立即执行的函数,其函数名称就会自动被忽略,均不能再通过函数名再次被调用。所以,在写立即执行函数时就没有必要写函数名称。
function test(a,b,c,d){
console.log(a+b+c+d);
}(1,2,3,4)
//浏览器报错么?为什么。
//不报错,js引擎解析时时尽量不报错就不报错的,除非错得不能再错
//在上面的代码中,js引擎时将函数声明function test(){…………}和
//逗号运算符(1,2,3,4)分开来看的,所以js引擎不报错但函数也不会被调用执行,
//不会有打印信息的。
//解释:逗号运算符,即返回逗号语句最后一个表达式的值。
//实现1*2*3...*10
function fn(n) {
if (n <= 1) { //终止条件
return 1 //这里返回最后一次调用的值
} else {
return n * fn(n - 1)
}
}
var re = fn(10)
console.log(re)
//fn(10)==>10*fn(9)==>10*9*fn(8)==>10*9*8*fn(7)==>....10*9...2*fn(1)
//假设你只知道数组内部全是(数字和数组的混套),不知道嵌套了几层
//打印出所有数字
var arr = [
[1, 2, 3, 4, [2, 3, 4, 5],
[2, 3, 4, 5],
[4, 54, 2, 6]
],
[2, 3, 4, 4, 5, 6]
]
function fn(arr) {
// 遍历数组
for (var i = 0; i < arr.length; i++) {
if (typeof (arr[i]) == "number") {
console.log(arr[i])
} else {
fn(arr[i])
}
}
}
fn(arr)
结果:打印出数组里所有数字
// fn标识符的问题 因为它是函数定义时的名字 函数体内部可以直接访问
var obj = {
say: function fn(n) {
console.log(666)
if (n < 0) {
return
}
// say(n-1)//报错
fn(n - 1) //自己调用自己
}
}
(function (n) {
if (n <= 1) {
console.log(1)
} else {
console.log(n);
arguments.callee(n - 1)
}
})(10)