JavaScript中的函数自调用
结果:结果:function定义部分的括号不可省,不能写成function(){}()这种格式。不然就会报错自调用函数也可称之为”立即执行函数“,函数执行完函数空间就被释放,不能再被访问,但函数返回值可以被保存。故这种调用方法多是针对初始化功能的函数,即函数只执行一次的情况。结果:函数自调用执行之后(打印出字符串hello),报错fn is not defined上例验证了,被立即执行的函数,其函
·
JS函数自调用/预编译
一、函数自调用
(1) 函数表达式可以 “自调用”,称之为自调用表达式。如果表达式后面紧跟 () 则会自动调用:
var funcExpre = function () {
var x = "Hello!!";
console.log(x);
return 3;
}();
console.log(funcExpre);
结果:
(2) 不能自调用声明的函数!故通过添加括号,来说明它是一个函数表达式:
(function fn() {
var x = "Hello!!";
console.log(x);
return 3;
})();
结果:
PS:
function定义部分的括号不可省,不能写成function(){}()这种格式。不然就会报错
function fn() {
var x = "Hello!!";
console.log(x);
return 3;
}();

(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引擎不报错但函数也不会被调用执行,
//不会有打印信息的。
//解释:逗号运算符,即返回逗号语句最后一个表达式的值。
(4)循环自调用函数
案例①
//实现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)
结果:打印出数组里所有数字
(5)定义式标识符访问问题
// fn标识符的问题 因为它是函数定义时的名字 函数体内部可以直接访问
var obj = {
say: function fn(n) {
console.log(666)
if (n < 0) {
return
}
// say(n-1)//报错
fn(n - 1) //自己调用自己
}
}
(6)匿名函数自调用-使用arguments.callee()
(function (n) {
if (n <= 1) {
console.log(1)
} else {
console.log(n);
arguments.callee(n - 1)
}
})(10)
结果:
更多推荐



所有评论(0)