首页 > 请教一段js代码的解释

请教一段js代码的解释

我注释了下我的思路
我这样想正确吗?
后面问号的我不懂什么意思
可以帮我解释下吗?这种函数应用场景是什么
(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.2func1是个立即执行函数,那么必然会传给它一个参数,也就是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);

调用一样。

【热门文章】
【热门文章】