今天遇到些问题, 以前没有去深究, 今天通过一个博客, 学了一点儿
- 首先我不知道立即执行函数为啥可以调用
- 为啥写了个括号就可以调用了
- 好处是啥, 为啥不直接用函数名掉用一下
据了解:
- 立即执行函数,当只需要函数执行一次就行了,以后都不会执行,为了避免函数占用空间,就用立即执行函数,让他执行完一次后就自动销毁吧。
- 为啥立即执行函数是这种写法? 刚学就是记住, 现在看看到底为啥
(function() {
console.log("写法一");
})();
(function() {
console.log("写法二");
}())
看一些规定
- 只有函数表达式才能被执行符号执行 到这我虽然看过表达式, 但是感觉概念不清晰, 我就有写了表达式的概念文章 点击跳转:
- 被执行符号执行完,函数名字就被放弃了,没名了
- 执行符号就是() 这句不懂他举了例子, 看下面第二个例子就理解了
function test() {
console.log("执行");
}() // 是函数声明,执行不了,报错
*****************************************
function test() {
console.log("执行");
}
test() // test是表达式,可以被执行符号执行
*****************************************
var test = function() {
console.log("执行");
}(); //函数表达式,也是表达式,可以被执行符号执行
console.log(test); //undefined
*****************************************
然后根据那句话, 表达式才可以使用执行函数去执行
- 既然表达式才可以被立即执行符号执行 那对第一个例子更改下,让他变为表达式。就可以正常运行了
- 在前面添加正号 +,-, !等都可以转变为表达式 骚不骚,说不定就是笔试题哦
+ function test() {
console.log("执行");//执行
}();
console.log(test); //ReferenceError: test is not defined 名字没了
然后根据他的文章说的向下看
-
既然你+可以转,那我() 算不算运算符,那也是同样道理可以的呀 那就把+换成。
-
既然一被执行符号执行名字都没了,那干脆名字我也不写了,写了也白写,那简化不就得到最后我们常用的形式了吗?
(function() {
console.log("写法一");
})();
(function() {
console.log("写法二");
}())
最后
看完了 还觉了立即执行函数就俩种写法吗? 你要是想sao 什么加+,-,!,|| 都是可以的啊,主要是,以后碰到这种恶心的题目,别被唬到了
+ function test() {
console.log("执行");//执行
}();
console.log(test); //ReferenceError: test is not defined 名字没了
虽然看完这文章, 我还在想为啥同样的调用函数, 立即执行函数就被除名了
画个问号, 接着搜....
- 然后我就发现
- 规定是立即执行函数, 然后我的问题还没解决
我就硬着加个名字, 他就除名了, 为啥???
- 我去问一个技术大牛, 他说 立即执行函数就是匿名的, 执行之后不删除, 放在内存等着过年吗?? 还加个名字, 文档中都说了匿名, 你脱裤子放屁???
到这我彻底懂了立即执行函数是个什么鬼了
注意: 最后再说一个问题
javascript中的封号, 在写java时, 我去看了php都是需要封号的, js为啥不用呢, 陷入沉思....
- 原本他是语言, 了解到在规范中他是有封号的, 一个语句就是用封号结尾的, 但是原因是js早期都运行在浏览器端, 然后老外不想写;封号, 中国人也不爱写, 然后浏览器属于第三方(商业机构), 所有的程序员都不想写; 那么浏览器为了bug少, 用户使用也好, 然后浏览器就搞了个功能, 如果是语句就给你加封号, 这也就是浏览器的一个机制, 他通过这个机制给js引擎去实现这个功能
- 在java中, php中他们是服务端语言, 所以都是强制加封号
- 但是这个封号到底打不打呢, 需要打吗? 需要, 能不加吗, 能
问题来啦, 立即执行函数是一个表达式那么他需要加封号吗? 会自动判断吗 ??
第一个正常, 第二个就识别不出来了, 就是因为封号的问题
那么手动加封号的呢?
一般是前面加; , 最好前后都加;
立即执行函数还有啥用作用
如果我们需要在一个模块文件中, 创建一个作用域, 我们想到的是函数, 然后执行他, 其实写成立即函数更省事一些 首先这样想:
function test() {
}
test()
// 这样也可以但是很麻烦, 没有立即执行函数简单
;(function() {
// 作用域 执行期上下文
// 模块的独立作用域
// 就可以这样写
var arr = [1,2,3,4,5]
})();
所以立即执行函数就是函数让他执行, 也没啥神奇的
也可以看一下大牛的文章zhuanlan.zhihu.com/p/22465092, 他是讲了及执行函数可以形成一个独立的作用域