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

Posted simon麦田

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js关于立即执行函数的一点记录相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

函数声明和函数表达式不同之处在于:

一、Javascript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式。

二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以functionName()形式调用 这里有很重要的一点就是对于js引擎在发现凡是函数表达式时,再其后加了()都会立即调用

functionName(); function functionName()      ... //正常,因为‘提升’了函数声明,函数调用可在函数声明之前   functionName(); var function Name= function ()      ... //报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后   functionName(); var function ame= function ()      ... //报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后
var function Name= function ()      alert( 'Hello World' ); (); //函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数 function functionName()      alert( 'Hello World' ); (); //不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用 function ()      console.log( 'Hello World' );    (); //语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作, //所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名

js引擎会把什么样的情况解析为函数申明,什么样的解析为表达式呢?

对于函数申明来说:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中 对于函数表达式来说:出现在表达式的位置(这就包括()、!、+、-、=,以及作为参数的时候 但是加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。

( 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);   js立即执行函数

()()表达式立即执行的记录

js立即执行函数

关于js立即执行函数

记录闭包和立即执行函数

关于函数,你知多少?