看了好多地方讲这两个东西,我一直以为不一样,后来仔细体会发现这两个其实是一样的,没有什么不同。只是使用的位置不同。
函数的自执行:
-----------------------------------------------------------------------------------------
// 下面2个括弧()都会立即执行
(function () { /* code */ } ()); // 推荐使用这个
(function () { /* code */ })(); // 但是这个也是可以用的
---------------------------------------------------------------------------------
关于前面加!等的作用:
// 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的
// 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了
var i = function () { return 10; } ();
true && function () { /* code */ } ();
0, function () { /* code */ } ();
// 如果你不在意返回值,或者不怕难以阅读
// 你甚至可以在function前面加一元操作符号
!function () { /* code */ } ();
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();
一元运算符表示他是一个表达式而不是函数声明。
void 比!写的多,好像速度快一点。
块级作用域还有一个功能是传参。改变他本地的显示形式。
------------------------------------------------------------------------------
函数的自我执行,一般情况下,习惯在前边加一个!之后的,特别在一个整体的js文件开始的时候,块级使用在js函数的里边,一般前面都没有,
函数声明的方式,两次用的差别不大,但是在函数表达式的时候差别就有点大。
如果用自我执行的话。
var box=(function(){return 'hello'})()
如果用块级作用域的话
var box=(function(){
function (){return 'hello';}
})()
这里的块级作用域直接报错了,所以不能这样写。不能一个匿名函数的自我执行。如果不是匿名函数就可以了。
块级作用域不能赋值给一个对象中,有的模块js代码,习惯在块级作用域前加!,表示块级作用域不是一个表达式。
=====================================
后来补充:
发现并不是块级作用域在哪里都行的,可能因为水平太次了,
在事件中,在onresize,在h5的横竖屏转换的逻辑中,如果你想通过块级作用域,区分每次的self是不行的。
即使你的self经过了浅拷贝也不行的,$.extend({},self);
========================================
有时间看看这个:
===========================