js立即执行函数

立心      2022-02-09     343

关键词:

javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解。

( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此。要理解立即执行函数,需要先理解一些函数的基本概念。

函数声明、函数表达式、匿名函数

函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。

函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。

匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

函数声明和函数表达式不同之处在于,一、Javascript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子。

1
2
3
4
5
6
7
8
9
10
11
fnName();
function fnName(){
    ...
}
//正常,因为‘提升’了函数声明,函数调用可在函数声明之前
 
fnName();
var fnName=function(){
    ...
}
//报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后

1
2
3
4
5
6
7
8
9
10
11
12
13
var fnName=function(){
    alert(‘Hello World‘);
}();
//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数
function fnName(){
    alert(‘Hello World‘);
}();
//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
function(){
    console.log(‘Hello World‘);   
}();
//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作,
//所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名


在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数,并后面加个括号立即调用函数,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(function(a){
    console.log(a);   //firebug输出123,使用()运算符
})(123);
 
(function(a){
    console.log(a);   //firebug输出1234,使用()运算符
}(1234));
 
!function(a){
    console.log(a);   //firebug输出12345,使用!运算符
}(12345);
 
+function(a){
    console.log(a);   //firebug输出123456,使用+运算符
}(123456);
 
-function(a){
    console.log(a);   //firebug输出1234567,使用-运算符
}(1234567);
 
var fn=function(a){
    console.log(a);   //firebug输出12345678,使用=运算符
}(12345678)

可以看到输出结果,在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。

加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。

不过这样的写法有什么用呢?

javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。






js基础_立即执行函数

1<!DOCTYPEhtml>2<html>3<head>4<metacharset="UTF-8">5<title></title>6<scripttype="text/javascript">789//函数对象()10/*11*立即执行函数12*函数定义完,立即被调用,这种函数叫做立即执行函数13*立即执行函数 查看详情

js立即执行函数

js立即执行函数 (function(a){console.log(a);})(1);(function(a){console.log(a);}(2));//在function前面使用(),!,+,-,=可以将函数声明转换成函数表达式,消除了js引擎对函数声明和函数表达式的歧义+function(a){console.log(a);}(3);varfn=function(a){conso 查看详情

js立即执行函数

...深入理解。(function(){…})()和(function(){…}())是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的 查看详情

js立即执行函数

对于非匿名的立即执行函数需要注意以下一点letfoo=1(functionfoo(){foo=10console.log(foo)}())//->ƒfoo(){foo=10;console.log(foo)}因为当JS解释器在遇到非匿名的立即执行函数时,会创建一个辅助的特定对象,然后将函数名称作为这个对象的属性... 查看详情

js函数的应用---立即执行函数全局污染闭包沙箱递归

一、立即执行函数---IIFE立即执行函数的集中表现形式:立即执行函数的特点:二、JS全局污染为什么会造成全局污染?JS没有块级作用域,在函数外定义的变量,均为全局变量;全局变量过多会削弱程序的灵活性,增大了模块之... 查看详情

js中(function(){…})()立即执行函数写法理解

(function(){…})()和(function(){…}())是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此。要理... 查看详情

重回js--立即执行函数

...觉厉的细节知识补起来。第一篇,就来说说函数表达式之立即执行  先上段代码,看下什么格式是立即执行函数:  foo这个 查看详情

js立即执行函数

js没有私有作用域的概念,避免命名冲突,引入了“匿名包裹器”或者“命名空间”的写法,即用匿名函数作为一个容器js引擎在执行js代码时会“函数声明提升”,而函数表达式会从上至下逐行执行,js的函数和... 查看详情

关于js立即执行函数

 我们一般要执行一个函数是先声明后调用执行,但是js有一种方式可以在定义的同时进行执行,(function($){})();例如上式:将一个匿名函数用括号括起来,后面又跟一个括号,里面是函数的实参,也就是传的参数。例: (fun... 查看详情

js立即执行函数应用--事件绑定

js中立即执行函数的应用:应用到事件绑定上。少说多做,直接运行代码(代码中有注释):1<!DOCTYPEhtml>2<htmllang="zh">3<head>4<metacharset="UTF-8"/>5<metahttp-equiv="X-UA-Compatible"content="ie=edge"/>6<title> 查看详情

js关于立即执行函数的一点记录

(function()…)()和(function()…())是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此。... 查看详情

前端开发:立即执行函数(function()())与(function())()的区别

...时候会有所遗漏。那么本篇博文就来分享一下关于在JS中立即执行函数相关的对比使用总结,方便查阅使用。什么是立即执行函数声明一个函数,然后立即调用该函数,这时候的该函数就是一个立即执行函数,换句话说就是声明... 查看详情

立即执行函数(代码片段)

一:什么是立即执行函数?声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;//(function()())w3c标准//(function())()//只有表达式才被执行符号执行//+fu... 查看详情

js立即调用函数

functionmakeCounter(){//不能立即执行//只能在makeCounter内部访问ivari=0;returnfunction(){console.log(++i);};}varcounter=makeCounter();//对象1counter();//logs:1//立刻执行counter();//logs:2varcounter2=makeCounter();//对象2co 查看详情

记录闭包和立即执行函数

闭包:http://www.runoob.com/js/js-function-closures.html 立即执行函数:IIFE(ImmediatelyInvokedFunctionExpression)http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife 查看详情

立即执行函数—匿名函数

JS中关于(function(window,undefined){})(window)写法的理解2013年01月04日 ?综合 ?共672字?字号 小 中 大 ? 评论关闭在jquery中我们经常看到以下这段代码:;(function($,window,document,undefined){//函数体内具体代码})(jQuer 查看详情

javascript闭包立即执行函数(代码片段)

...、为什么要闭包二、让某些变量得以常驻内存1.原理2.Why立即执行函数?三、让外部得以访问函数内变量四、立即执行函数总结#前言-什么是闭包函数闭包函数是声明在另一个函数内的函数,是被嵌套在父函数内部的子函数,在《JS高... 查看详情

js基础学习

...个undefined, 如果函数中不写return,则也会返回undefined.56:立即执行函数:函数定义完立即被执行。 function(){ alert("我是匿名函数"); }//这是一个函数对象,只不过没有名字,要想让她立即执行,则只需()括起来这个匿名函数,使其... 查看详情