我注释了下我的思路
我这样想正确吗?
后面问号的我不懂什么意思
可以帮我解释下吗?这种函数应用场景是什么
(function(){
})(function(){
}())
这种立即调用函数里面再写一个立即调用函数的写法叫什么?
var fun = (function(a){//定义函数表达式并定义参数a
this.a = a;//定义当前域变量a等于参数a
return function(a){//返回一个匿名函数定义参数a
a+= this.a;//a等于this.a+1
return a;//返回a
}
})(function(a,b){//??????
return a;//????
}(1,2))//??????
fun(4)
暂时没想出来应用场景,解释一下函数的表面意思。
(function(a,b){//??????
return a;//????
}(1,2)
这部分就是1 也就是把1传到了第一个匿名函数里。
也就是第一行的a
永远为1。
调用了fun以后会返回参数+1的数字。
fun(1) = 2
fun(2) = 3
....
你的代码有两个自执行函数。
图片串起来的函数的作用可以理解为返回数字1, 这个部分的代码就不用再去费脑力了
var fun = (function(a){//定义函数表达式并定义参数a
this.a = a;//定义当前域变量a等于参数a
return function(a){//返回一个匿名函数定义参数a
a+= this.a;//a等于this.a+1
return a;//返回a
}
})(1);
又是一个自执行函数,结果如下
a = 1;
var fun = function (b) {
b += a;
return b;
}
其实这段代码并不复杂,只不过存在多个function
,显得比较复杂,看起来比较混乱,可以分解开来,一部分一部分的看:
1.首先是一个声明了一个变量:
var fun = (...);
这个很明显,定义了fun
的变量。
2.变量func
的=
右侧是一个表达式,这个表达式是一个立即执行函数
,那么也分两部分看,先看函数声明:
function(a){
this.a = a;
return function(a){
a+= this.a;
return a;
}
}
为了区别,这个函数可以称之为func1
.
这个func1
函数接收一个参数a
,返回一个函数,这个函数称之为func2
。那么可以预想到,1
中的fun
的值就为这个返回的函数func2
。
3.2
中func1
是个立即执行函数
,那么必然会传给它一个参数,也就是func1
的形参a
。这个参数又是一个立即调用函数
,这里比较简单,直接贴出来。
function(a,b){
return a;
}(1,2)
返回结果就是1,也就是说2
中的func1
的形参a
被赋值为了1。同样地,也可以得知2
中的func2
由于闭包
会维持a
这个值。
你贴的代码简化一下就得出:
var fun = function(a){
return a + 1;
}
至于这种场景,可以肯定的说有,而且不少。
我先贴出一个:
( function( global, factory ) {
"use strict";
if ( typeof module === "object" && typeof module.exports === "object" ) {
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
//.......................
这是jQuery
的源码的开头部分。
而且像这类写法的开源库/工具有很多,目的是为了兼容多个模块化标准,可以在浏览器以及服务器端(NodeJS)中都能使用。
是不是还有其他的应用,就不晓得了。
楼主的变量用得有点乱, 先给你改改.
var fun = (function(a){ //定义函数表达式并定义参数a
this.a = a; //定义当前域变了a等于参数a
return function(num){ //返回一个匿名函数定义参数a
num += this.a; //a等于this.a+1
return num; //返回a
}
})(function(x,y){ //??????
return x; //????
}(1,2)) //??????
alert(fun(4));
每个函数都有一个单独的作用域, 除非特殊情况, 定义函数的形参时尽量不要用一样的. 不然会绕.
以上总共出现了三个函数:
函数1: 参数为a
功能: 接收一个值, 将这个值赋给this.a, 并返回函数2.
函数2: 参数为num
功能: 接收一个值, 返回这个值 + this.a
函数3: 参数为x,y
功能: 接收两个值, 返回第一个值.
函数功能已经分析清楚啦, 那就来看看上面的代码都发生了什么.
函数1需要一个参数, 把函数3当做参数传进去了, 函数3接收两个参数然后返回第一个(此处是1), 就相当于直接把1当做参数传递给了函数1.
函数1接收参数后先为执行对象定义一个属性a, 然后将传递进来的参数赋值给属性a. 再然后返回函数2.
函数2接收一个参数(此时是4), 返回这个参数 + this.a
故返回了5.
为什么一定要把代码写成这个鬼样子。。。
(function add(a,b){
return a+b;
})(1,2)
这种写法是自动执行的意思,后面的括号里是传入的参数。相当于
add(1,2);
调用一样。