JavaScript中的函数自调用

JS函数自调用/预编译

    • 一、函数自调用
      • (1) 函数表达式可以 "自调用",称之为自调用表达式。如果表达式后面紧跟 () 则会自动调用:
      • (2) 不能自调用声明的函数!故通过添加括号,来说明它是一个函数表达式:
        • PS:
      • (3)自调用函数也可称之为”立即执行函数
          • 阿里笔试题
      • (4)循环自调用函数
        • 案例①
        • 案例②
      • (5)定义式标识符访问问题
      • (6)匿名函数自调用-使用arguments.callee()

一、函数自调用

(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);
}(1234//浏览器报错么?为什么。

//不报错,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)

结果:JavaScript中的函数自调用_第1张图片

你可能感兴趣的:(JavaScript精通之路,javascript,前端,开发语言)