JS自调用函数问题(立即执行函数)

第一个问题

function ( ) {

console.log("fun1");

}() 为什么执行不了?

.

“函数使用function关键字来定义,可以使用函数定义表达式或者函数声明语句。两种形式中,函数定义都是从function关键字开始。其后跟随:函数名称标识符(函数名称是函数声明语句必需的部分;对于函数定义表达式来说,这个名字是可选的:如果存在,该名字只存在于函数体中,并指代该函数对象本身)。”—摘自《JavaScript权威指南》

1、使用function声明的函数,必须要有函数名称,否者会抛出语法错误。上面的代码执行过程中,解析器解析function关键字时,默认该代码是function声明,而不是function表达式,编译器会默认生成一个缺少名字的function,并且抛出一个语法错误。

代码执行结果,如图:

2、那么试一下给function加上名字,看看还会不会报错。

结果依然报错,虽然上面的代码已经没有语法问题,但是问题出在圆括号运算符“( )”,我们来理解一下圆括号运算符“( )”,也称为分组运算符,它有两种用法:如果表达式放在圆括号中,作用是求值;如果跟在函数后面,作用是调用函数。

为什么会这样呢?在一个表达式后面加上圆括号,表示该表达式立即执行;而如果是在一个语句后面加上括号,该括号完全和之前的语句不搭,而只是作为一个分组运算符,用来控制运算中的优先级(小括号里的先运算),所以以上代码等价于:

相当于先声明了一个叫fn的函数,之后进行“( )”内的表达式运算,但是“( )”分组运算符内的表达式不能为空,所以报错。

第二个问题

(function ( ) {

console.log("fun1");

})()

.

(function ( ) {

console.log("fun1");

}())

为什么能执行?

1、在JavaScript里,括号内部不能包含语句,当解析器对代码进行解析的时候,先碰到了(),然后碰到function关键字就会自动将()里面的代码识别为函数表达式而不是函数声明。

2、(function(){})会返回函数对象的引用,最后使用圆括号()调用此函数。

第一个问题

function ( ) {

console.log("fun1");

}() 为什么执行不了?

.

“函数使用function关键字来定义,可以使用函数定义表达式或者函数声明语句。两种形式中,函数定义都是从function关键字开始。其后跟随:函数名称标识符(函数名称是函数声明语句必需的部分;对于函数定义表达式来说,这个名字是可选的:如果存在,该名字只存在于函数体中,并指代该函数对象本身)。”—摘自《JavaScript权威指南》

1、使用function声明的函数,必须要有函数名称,否者会抛出语法错误。上面的代码执行过程中,解析器解析function关键字时,默认该代码是function声明,而不是function表达式,编译器会默认生成一个缺少名字的function,并且抛出一个语法错误。

代码执行结果,如图:

2、那么试一下给function加上名字,看看还会不会报错。

结果依然报错,虽然上面的代码已经没有语法问题,但是问题出在圆括号运算符“( )”,我们来理解一下圆括号运算符“( )”,也称为分组运算符,它有两种用法:如果表达式放在圆括号中,作用是求值;如果跟在函数后面,作用是调用函数。

为什么会这样呢?在一个表达式后面加上圆括号,表示该表达式立即执行;而如果是在一个语句后面加上括号,该括号完全和之前的语句不搭,而只是作为一个分组运算符,用来控制运算中的优先级(小括号里的先运算),所以以上代码等价于:

相当于先声明了一个叫fn的函数,之后进行“( )”内的表达式运算,但是“( )”分组运算符内的表达式不能为空,所以报错。

第二个问题

(function ( ) {

console.log("fun1");

})()

.

(function ( ) {

console.log("fun1");

}())

为什么能执行?

1、在JavaScript里,括号内部不能包含语句,当解析器对代码进行解析的时候,先碰到了(),然后碰到function关键字就会自动将()里面的代码识别为函数表达式而不是函数声明。

2、(function(){})会返回函数对象的引用,最后使用圆括号()调用此函数。

原文地址:https://www.cnblogs.com/weizhichang/p/12013364.html

时间: 2024-09-29 01:25:45

JS自调用函数问题(立即执行函数)的相关文章

onload函数和自执行函数的区别(jquery API网址:http://jquery.cuishifeng.cn/)

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>jQuery 01 simples</title> <script src="js/jquery-1.12.1.js" type="text/javascript"></script> <sc

JavaScript中的匿名函数、立即执行函数和闭包

匿名函数是没有函数名的,不能单独使用: 立即执行函数是基于匿名函数实现的,也没有函数名,会在定义后立即执行: 闭包是有权访问另一个函数作用域中的变量的函数.匿名函数.立即执行函数只要满足 有权访问另一个函数作用域中的变量 这一个条件,就成了闭包. 匿名函数 匿名函数:没有函数名的函数 匿名函数不能单独定义与使用 function foo() { console.log('普通函数'); } // 去掉函数名 foo function () { // SyntaxError: Function s

立即执行函数表达式(自执行函数)

立即执行函数表达式 立即执行函数表达式,大部分人也称为自执行函数. 自执行函数的写法 匿名函数 (function(){ console.log(2) })() 具名函数 (function log(){ console.log(2) })() 自执行函数的传参 (function add(a, b){ console.log(a + b) })(1,2) 返回值 let fn = (function add(a,b){ return a + b; })(2,4); console.log(fn

JS 自定义sleep以及Ajax 自执行函数

<script src="/static/js/jquery-2.1.1.min.js"></script> <script> function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMillis; while (true) { now = new Date(); if (now.getTime() > exitTime)

js每隔一段时间执行函数

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> </body> <script type="application/javascript"> setInterval(function(){ console.log(new Date

Python(73)_装饰器函数练习_执行函数前登录验证

#-*-coding:utf-8-*- import os import time from functools import wraps ''' 1.编写装饰器,为多个函数加上认证的功能(用户的账号和密码来源于文件) 2.要求登录一次,后续函数都无需输入用户名和密码 ''' FLAG = False def login(func): def inner(*args,**kwargs): global FLAG ''' 登录程序 ''' if FLAG: ret = func(*args, **

依据函数名字符串执行函数

这个问题虽然不是很严重,但却困扰本人许久.曾经多方询问朋友.查阅资料均无法达到效果. 今日偶然查到一些东西,经实测的却可行,也算了却了一桩心愿. 不再废话直接贴DEMO代码 1 unit Unit2; 2 3 interface 4 5 uses 6 Vcl.Dialogs, Vcl.Forms, System.Generics.Collections, System.Variants; 7 8 type 9 TMyIntf = class(TForm) 10 public 11 class f

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

一.立即执行函数 --- IIFE 立即执行函数的集中表现形式: 立即执行函数的特点: 二.JS 全局污染 为什么会造成全局污染? JS 没有块级作用域,在函数外定义的变量,均为全局变量: 全局变量过多会削弱程序的灵活性,增大了模块之间的耦合度,多人协作开发会导致变量冲突,造成环境污染. 耦合度:即模块之间的依赖关系:控制关系.调用关系.数据传递关系: 划分模块准则:高内聚低耦合 如何解决全局污染? 1. 命名空间 2. 立即执行函数(里面创建的变量,为局部变量) (function(){})(

js 立即执行函数

1.我们首先要搞明白:函数表达式和函数声明的区别. 函数表达式:既可以为匿名函数也可以有函数名,但是调用的时候都是通过函数左边的变量func来调用 var func = function(){ alert('xxx'); }; var b = new func(); 函数声明:必须有函数名 function func(){ alert('xxx'); } func(); 所以立即执行调用的函数表达式有一下几种 !function () { /* code */ } ();~function ()

js基础之javascript函数定义及种类-普通涵数-自执行函数-匿名函数

普通函数 1.不带参数 function fucname(){ alert("hello"); } funcname() 2.带参数 function funcname(arg){ alert("hello"); } funcname("Brin") 普通函数,自执行函数 1.不带参数 (function(){ alert(123); })() 2.带参数 (function(arg){ alert(123); })("Brin&quo