js中立即执行函数会预编译吗_javascript的立即执行函数

在javascript中有引入立即执行函数的概念,那么什么是立即执行函数呢?立即执行函数又是怎么写的呢?立即执行函数与普通函数有什么区别呢?

先来看看一般的函数:

functiona(){var num = 100;

console.log(num);

}

以上就是javascript中随便定义的最普通的函数,函数一旦被定义,就会一直等着被执行,会一直占用空间。除非等到javascript执行完函数才会被释放。但是有些时候不想要这么多空间被占用,因为会浪费效率。有些函数从出生到javascript执行完它就只被执行了一次。这就导致该函数的空间被一直占用。为了避免这种不必要的空间被一直占用,javascript引入了立即执行函数。

(functiontest(){var a = 12;var b = 13;

console.log(a+b);

}())

上边这种写法就是立即执行函数

我们看出函数可以正常执行,但是在执行之后就再也找不到这个函数了。所以立即执行函数我们一般不给他取名字。

同样和普通的函数一样,立即执行函数也可以有参数和返回值。(不能有返回值的函数还要它干嘛啊)

var sum = (function(x,y,z) {return x+y+z;

}(5,6,7))

这样的话,函数执行完虽然被销毁,但是返回值被num接收。同样也解决了内存占用的问题。

下边是两种常见的立即执行函数的写法:

(function (){}()); W3C建议使用第一种

(function (){})();

在开发中,立即执行函数主要用于解决闭包的问题和针对初始化的功能等,在初始化页面时用到的立即执行函数不需要有返回值,但是在初始化页面的时候用到的立即执行函数一定要有返回值。立即执行函数照样有执行期上下文,内部照样执行预编译的环节。

再往深了探究,1.只有表达式才可以被执行符号(小括号)执行。2.能被执行符号执行的表达式他的名字就会自动被忽略。什么意思呢?看下边的例子

先来解释上边的第一句话。我们知道函数的定义分为两种(函数声明和函数表达式)

function test(){

console.log(123);

}()

看上边的代码能执行吗?

单写test表示函数的引用,正常情况下想要执行函数直接test(); 函数名加小括号即可,上边的函数声明跟函数引用一样,那直接加一对小括号应该也可以执行呀,结果却不然:

在系统看来这是一个非常低级的语法错误。因为小括号前边的是函数声明,而不是表达式,所以就不能被执行。

再看下边这种写法:

var a =function (){

console.log(123);

}()

这回小括号前边很明显是表达式,所以就可以执行。

再解释上边的第二句话。

var a =function (){

console.log(123);

}

现在的a还代表函数的名字呢

在下边执行这个表达式:

var a =function (){

console.log(123);

}()

这时候的a已经不再表示这个函数名了。

所以:能被执行符号执行的表达式他的名字就会自动被忽略。

类似的:

+function (){

console.log(123);

}()

-function (){

console.log(123);

}()

!function (){

console.log(123);

}()

以上几种情况前边很明显是表达式,所以就可以执行。这回就一目了然为啥整体加个小括号就可以立即执行了吧,因为被小括号括起来就变成了表达式嘛,自然可以执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值